unitarias unit test pruebas c# linq unit-testing lambda expression

test - pruebas unitarias c#



Error de prueba unitaria: esta funciĆ³n solo puede invocarse desde LINQ a Entidades (1)

Cuando EF genera el código SQL, lo único que importa es el atributo System.Data.Entity.DbFunction . El cuerpo del método arroja una excepción, pero nunca se llama cuando se usa la base de datos real.

Para probar esto, puede crear su propio método con el atributo DbFunction y una implementación. Cuando se ejecuta contra la base de datos, EF generará SQL e ignorará su código. Al ejecutar una prueba unitaria, su código se ejecutará.

Su método se vería así:

public static class TestableDbFunctions { [System.Data.Entity.DbFunction("Edm", "DiffHours")] public static int? DiffHours(DateTime? dateValue1, DateTime? dateValue2) { if (!dateValue1.HasValue || !dateValue2.HasValue) return null; return (int)((dateValue2.Value - dateValue1.Value).TotalHours); } }

El código de comparación solo por ejemplo, querría asegurarse de que esto coincida con el comportamiento de SQL o de lo contrario sus pruebas no serán válidas.

Una vez que tenga esto, simplemente cambie su código para usar el nuevo método:

return Account => TestableDbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;

Si escribe una buena prueba para esto, detectará el error que está pasando en un número de días y comparará varias horas.

Estoy codificando una aplicación de Internet MVC 5, y tengo una expresión de la siguiente manera:

public Expression<Func<Account, bool>> IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(int minimumDaysLeftInSubscriptionForEmail) { return Account => System.Data.Entity.DbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail; }

Al recuperar datos de la base de datos, la expresión anterior se completa correctamente. Sin embargo, al escribir una prueba unitaria que utiliza la expresión anterior, recibo el siguiente error:

Esta función solo puede invocarse desde LINQ a Entidades

Supongo que esto se debe a que la función System.Data.Entity.DbFunctions.DiffHours convierte la expression en código que solo un sistema de base de datos puede comprender.

Debido al hecho anterior, ¿es posible probar la expresión anterior cuando se usa un repositorio simulado que usa una List lugar de un DbSet ? Si no, ¿cómo debería probar la unidad cualquier código que use la expression ? ¿Es posible probar la expression unidad?

Gracias por adelantado.