use*_*648 21 c# linq lambda unit-testing expression
我正在编写一个MVC 5互联网应用程序,我有一个表达式如下:
public Expression<Func<Account, bool>> IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(int minimumDaysLeftInSubscriptionForEmail)
{
return Account => System.Data.Entity.DbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;
}
Run Code Online (Sandbox Code Playgroud)
从数据库中检索数据时,上述表达式正确完成.但是,在编写使用上述表达式的单元测试时,我收到以下错误:
只能从LINQ到实体调用此函数
我认为这是因为该System.Data.Entity.DbFunctions.DiffHours
函数将转换expression
为只有数据库系统才能理解的代码.
由于上述事实,当使用使用List
而不是DbSet
?的模拟存储库时,是否可以对上面的表达式进行单元测试?如果没有,我应该如何对使用该代码的任何代码进行单元测试expression
?有可能进行单元测试expression
吗?
提前致谢.
Fra*_*cis 33
当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);
}
}
Run Code Online (Sandbox Code Playgroud)
例如,比较代码,您需要确保这与SQL行为匹配,否则您的测试将无效.
完成后,只需更改代码即可使用新方法:
return Account => TestableDbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;
Run Code Online (Sandbox Code Playgroud)
如果您为此编写了一个很好的测试,它将捕获您在几天内传递的错误并比较几个小时.
归档时间: |
|
查看次数: |
6853 次 |
最近记录: |