Estoy usando EF 4.1 para construir un modelo de dominio. Tengo una clase de tareas con un método Validar (cadena de código de usuario) y en él quiero asegurar los mapas de código de usuario a un usuario válido en la base de datos, por lo que:Prueba de Moq LINQ Donde consultas
public static bool Validate(string userCode)
{
IDbSet<User> users = db.Set<User>();
var results = from u in users
where u.UserCode.Equals(userCode)
select u;
return results.FirstOrDefault() != null;
}
puedo usar Moq burlarse IDbSet ningún problema . Pero se metió en problemas con la llamada Dónde:
User user = new User { UserCode = "abc" };
IList<User> list = new List<User> { user };
var users = new Mock<IDbSet<User>>();
users.Setup(x => x.Where(It.IsAny<Expression<Func<User, bool>>>())).Returns(list.AsQueryable);
Initialization method JLTi.iRIS3.Tests.TaskTest.SetUp threw exception.
System.NotSupportedException: System.NotSupportedException: Expression
references a method that does not belong to the mocked object:
x => x.Where<User>(It.IsAny<Expression`1>()).
Aparte de la creación de un nivel de indirección (por ejemplo, usando un ServiceLocator para obtener un objeto que ejecuta el LINQ y luego burlarse de ese método) No puedo pensar en cómo más para probar esto, pero quiero asegurarme de que no haya forma antes de presentar otra capa. Y puedo ver que este tipo de consultas LINQ se necesitarán con bastante frecuencia para que los objetos de servicio puedan perder el control rápidamente.
¿Algún alma amable podría ayudar? ¡Gracias!
¿Hay algún motivo por el que intente sacarlo de allí con el uso de simulaciones en una prueba unitaria en lugar de simplemente escribir una prueba de integración? – csano
No es necesario que realice la prueba unitaria EF :) – Eranga
El método Validate() en realidad está simplificado. Tiene muchos argumentos y cada argumento es probado. Algunas son simples verificaciones de rango, algunas son verificaciones de existencia de DB (como el código de usuario aquí). –