2011-07-26 10 views
19

En mi método, tengo mi repositorio hacer esto:MOQ - LINQ predicados en Configuración del método

bool isConditionMet = MyRepository.Any(x => x.Condition == true); 

que estoy tratando de burlarse de esto usando MOQ de este modo:

MyMockedRepository.Setup(x => x.Any(y => y.Condition == true)).Returns(true); 

Sin embargo, cuando el el código se ejecuta, la llamada al repositorio siempre devuelve falso.

¿Hay alguna manera de hacerlo con MOQ?

** EDITAR - Adición de código por solicitud **

estoy usando NHibernate así que mi Cualquier método está en mi repositorio de base e implementado como tal:

public virtual bool Any(Expression<Func<T, bool>> predicate) 
{ 
    return Session.Query<T>().Cacheable().Any(predicate); 
} 
+0

¿Podría mostrar más código para 'MyRepository' es' Any() 'el método de extensión Linq o parte de' MyRepository'? –

+0

Agregué mi Cualquier método por solicitud desde mi repositorio base. La clase simulada es de 'IMyRepository' que se implementa en' MyRepository'. – Brandon

Respuesta

23

Es necesario que coincidan los argumentos de invocación utilizando It.Is, It.IsAny o It.IsRegex.

Por ejemplo, para volver true para cualquier predicado, se puede utilizar:

MyMockedRepository 
    .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(true); 

O bien, puede partidos todas las expresiones, pero pasar un delegado que devolverá un valor en función de la expresión sí mismo:

Func<Expression<Func<T, bool>, bool> resultFunc = { ... } 
MyMockedRepository 
    .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(resultFunc); 
+0

¡Muchas gracias! Esto funcionó perfectamente. – Brandon

+0

Por favor, ¿puedes decirme cómo se vería resultFunc? –

+0

@badrslaoui: depende de qué/cómo está probando. Por ejemplo, puede saber que el método que está comprobando verificará si el repositorio contiene algún valor y simplemente devuelve verdadero. O bien, puede burlarse de un repositorio utilizando una lista genérica simple en la memoria 'List ', lo que significa que simplemente puede pasar el parámetro expression a 'IQueryable.Any' de la lista y dejar que devuelva' true' o 'false'. O bien, dado que la lambda puede capturar variables externas, también puede mantener una bandera que indique si tiene datos o no, y luego devolver el valor de la bandera. – Groo

Cuestiones relacionadas