Ответ 1
Когда EF генерирует код SQL, единственное, что имеет значение, это атрибут System.Data.Entity.DbFunction
. Тело метода генерирует исключение, но никогда не вызывается при использовании реальной базы данных.
Чтобы проверить это, вы можете создать свой собственный метод с атрибутом DbFunction
и реализацией. При работе с базой данных EF генерирует SQL и игнорирует ваш код. При запуске unit test ваш код будет выполнен.
Ваш метод будет выглядеть примерно так:
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);
}
}
Код сравнения, например, вы должны быть уверены, что это соответствует поведению SQL, иначе ваши тесты не будут действительны.
Как только вы это сделаете, просто измените свой код, чтобы использовать новый метод:
return Account => TestableDbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;
Если вы напишите хороший тест для этого, он поймает ошибку, которую вы проходите в течение нескольких дней, и сравнивая несколько часов.