¿Cómo uso Moq y DbFunctions en las pruebas unitarias para evitar una excepción NotSupportedException?
Actualmente estoy intentando ejecutar algunas pruebas unitarias en una consulta que se ejecuta a través de Entity Framework. La consulta en sí se ejecuta sin problemas en la versión en vivo, pero las pruebas unitarias siempre fallan.
He reducido esto a mi uso de DbFunctions.TruncateTime, pero no sé cómo evitar esto para que las pruebas unitarias reflejen lo que está sucediendo en el servidor en vivo.
Aquí está el método que estoy usando:
public System.Data.DataTable GetLinkedUsers(int parentUserId)
{
var today = DateTime.Now.Date;
var query = from up in DB.par_UserPlacement
where up.MentorId == mentorUserId
&& DbFunctions.TruncateTime(today) >= DbFunctions.TruncateTime(up.StartDate)
&& DbFunctions.TruncateTime(today) <= DbFunctions.TruncateTime(up.EndDate)
select new
{
up.UserPlacementId,
up.Users.UserId,
up.Users.FirstName,
up.Users.LastName,
up.Placements.PlacementId,
up.Placements.PlacementName,
up.StartDate,
up.EndDate,
};
query = query.OrderBy(up => up.EndDate);
return this.RunQueryToDataTable(query);
}
Si comento las líneas con DbFunctions en, todas las pruebas pasan (excepto las que están comprobando que solo se ejecutan resultados válidos para una fecha determinada).
¿Hay alguna manera de proporcionar una versión simulada de DbFunctions.TruncateTime para usar en estas pruebas? Esencialmente, solo debería estar devolviendo Datetime.Date, pero eso no está disponible en las consultas EF.
Editar: Aquí está la prueba que está fallando y que usa la verificación de fecha:
[TestMethod]
public void CanOnlyGetCurrentLinkedUsers()
{
var up = new List<par_UserPlacement>
{
this.UserPlacementFactory(1, 2, 1), // Create a user placement that is current
this.UserPlacementFactory(1, 3, 2, false) // Create a user placement that is not current
}.AsQueryable();
var set = DLTestHelper.GetMockSet<par_UserPlacement>(up);
var context = DLTestHelper.Context;
context.Setup(c => c.par_UserPlacement).Returns(set.Object);
var getter = DLTestHelper.New<LinqUserGetLinkedUsersForParentUser>(context.Object);
var output = getter.GetLinkedUsers(1);
var users = new List<User>();
output.ProcessDataTable((DataRow row) => students.Add(new UserStudent(row)));
Assert.AreEqual(1, users.Count);
Assert.AreEqual(2, users[0].UserId);
}
Edición 2: Este es el mensaje y la traza de depuración de la prueba en cuestión:
Test Result: Failed
Message: Assert.AreEqual failed. Expected:<1>. Actual:<0>
Debug Trace: This function can only be invoked from LINQ to Entities
Por lo que he leído, esto se debe a que no hay una implementación de LINQ a Entidades de este método que se pueda usar en este lugar para la Prueba de la unidad, aunque sí en la versión en vivo (ya que está consultando un servidor SQL).