首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >单元测试错误:此函数只能从LINQ to Entities调用

单元测试错误:此函数只能从LINQ to Entities调用
EN

Stack Overflow用户
提问于 2015-02-04 09:44:01
回答 1查看 7.7K关注 0票数 21

我正在编写一个MVC5互联网应用程序,我有一个表达式如下:

代码语言:javascript
复制
public Expression<Func<Account, bool>> IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(int minimumDaysLeftInSubscriptionForEmail)
{
    return Account => System.Data.Entity.DbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;
}

从数据库中检索数据时,上述表达式正确完成。但是,在编写使用上述表达式的单元测试时,我得到了以下错误:

此函数只能从LINQ to Entities调用

我猜想这是因为System.Data.Entity.DbFunctions.DiffHours函数将expression转换为只有数据库系统才能理解的代码。

由于上述事实,在使用使用List而不是DbSet的模拟存储库时,是否可以对上面的表达式进行单元测试?如果没有,我应该如何对任何使用expression的代码进行单元测试?是否可以对expression进行单元测试

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-04 10:25:46

当EF生成SQL代码时,唯一重要的是System.Data.Entity.DbFunction属性。方法体抛出异常,但在使用实际数据库时从不调用。

要测试这一点,您可以使用DbFunction属性和实现创建自己的方法。当对数据库运行时,EF将生成SQL并忽略您的代码。当运行单元测试时,您的代码将被执行。

您的方法将如下所示:

代码语言:javascript
复制
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行为相匹配,否则您的测试将无效。

完成后,只需更改代码以使用新方法:

代码语言:javascript
复制
return Account => TestableDbFunctions.DiffHours(Account.freeTrialEndDate, DateTime.UtcNow) < minimumDaysLeftInSubscriptionForEmail;

如果你为此写了一个很好的测试,它将捕获你在几天内通过的bug,并比较几个小时的结果。

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28312094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档