2011-09-19 8 views
5

Estoy usando .net 4 con C#, EntityFramework 4 y Moq 4. Estoy intentando burlarme de mi UnitOfWork, un repositorio y finalmente una llamada a un método.Problema Mocking Lambda con el repositorio de Unitofwork

Aquí está el código que estoy teniendo problemas con

 var unitOfWorkMock = new Mock<UnitOfWork>(); 
     var cFieldRepositoryMock = new Mock<IRepository<CField>>(); 

     System.Linq.Expressions.Expression<Func<CField, bool>> query = (x) => x.CID == c && x.FID == parentFID; 

     cFieldRepositoryMock.Setup(x => x.GetFirst(query)); 

la firma del método para GetFirst:

  T GetFirst(Expression<Func<T, bool>> query = null, 
     Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null); 

cField:

public class CField 
{ 
    public CField() 
    { 
     //do stuff 
    } 
    public int ID { get; set; } 
    public int FID { get; set; } 
    public int CID { get; set; } 
} 

Lo que espero que suceda: I estoy esperando que cuando llamo a mi método GetFirst de cFieldRepositoryMock, será matc h la expresión lambda que paso frente a la expresión que definí en la configuración.

Qué pasa: que estoy recibiendo un error de compilación en la tarea de configuración: "un árbol de expresión no puede contener una llamada o invocación que utiliza argumentos opcionales"

que estoy haciendo algo mal con claridad, estoy simplemente no estoy seguro de qué. Cualquier consejo es apreciado, soy bastante nuevo en pruebas unitarias.

Gracias! AFrieze

+0

Podría publicar la declaración si CField y el método firma de getfirst()? – David

+0

Hola David, agregué la información solicitada. No puedo publicar toda la clase de CField, así que publiqué los campos relevantes con los tipos correctos y los niveles de accesibilidad. – AFrieze

+2

¿Ha agregado un argumento para el argumento orderBy (con It.IsAny <...> o null)? No sé exactamente, pero creo que Moq está usando Expressions y creo que debes proporcionar * all * Arguments aquí. – Carsten

Respuesta

8

El EROR que está recibiendo parece ser en realidad un limitation of expressions:

Para unittest cosas como esta cuenta para utilizar It.IsAny (como ya se ha sugerido Carsten):

cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>()));