Unit test error : This function can only be invoked from LINQ to Entities
Unit test error : This function can only be invoked from LINQ to Entities
我正在编写一个 MVC 5 互联网应用程序,我的表达式如下:
public Expression<Func<Account, bool>> IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(int minimumDaysLeftInSubscriptionForEmail)
{
return Account => System.Data.Entity.DbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;
}
从数据库中检索数据时,上述表达式正确完成。但是,在编写使用上述表达式的单元测试时,出现以下错误:
This function can only be invoked from LINQ to Entities
我认为这是因为 System.Data.Entity.DbFunctions.DiffHours
函数将 expression
转换为只有数据库系统才能理解的代码。
由于上述事实,当使用使用 List
而不是 DbSet
的模拟存储库时,是否可以对上述表达式进行单元测试?如果不是,我应该如何对使用 expression
的任何代码进行单元测试?是否可以对 expression
?
进行单元测试
提前致谢。
当 EF 生成 SQL 代码时,唯一重要的是 System.Data.Entity.DbFunction
属性。方法体抛出异常,但在使用真实数据库时从不调用。
要对此进行测试,您可以使用 DbFunction
属性和实现来创建自己的方法。当 运行 针对数据库时,EF 将生成 SQL 并忽略您的代码。当运行一个单元测试时,你的代码将被执行。
你的方法看起来像这样:
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;
如果你为此编写了一个好的测试,它将捕获你在几天内通过并比较几个小时的错误。
我正在编写一个 MVC 5 互联网应用程序,我的表达式如下:
public Expression<Func<Account, bool>> IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(int minimumDaysLeftInSubscriptionForEmail)
{
return Account => System.Data.Entity.DbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;
}
从数据库中检索数据时,上述表达式正确完成。但是,在编写使用上述表达式的单元测试时,出现以下错误:
This function can only be invoked from LINQ to Entities
我认为这是因为 System.Data.Entity.DbFunctions.DiffHours
函数将 expression
转换为只有数据库系统才能理解的代码。
由于上述事实,当使用使用 List
而不是 DbSet
的模拟存储库时,是否可以对上述表达式进行单元测试?如果不是,我应该如何对使用 expression
的任何代码进行单元测试?是否可以对 expression
?
提前致谢。
当 EF 生成 SQL 代码时,唯一重要的是 System.Data.Entity.DbFunction
属性。方法体抛出异常,但在使用真实数据库时从不调用。
要对此进行测试,您可以使用 DbFunction
属性和实现来创建自己的方法。当 运行 针对数据库时,EF 将生成 SQL 并忽略您的代码。当运行一个单元测试时,你的代码将被执行。
你的方法看起来像这样:
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;
如果你为此编写了一个好的测试,它将捕获你在几天内通过并比较几个小时的错误。