使用EF Core 2.0的单元测试

时间:2018-08-08 15:02:38

标签: c# unit-testing asp.net-core entity-framework-core asp.net-core-mvc-2.0

对于我正在实习的项目,我们必须使用存储库模式。由于该项目已经在使用EF Core,因此我读到底层实现中已经存在存储库和工作单元。我想我可以直接使用EF Core方法,而无需实现存储库类,因为我想避免混乱。

现在我有一个问题,当我以这种方式实现时,我似乎找不到关于单元测试的有用信息。该要求是一项艰巨的要求,由于该公司的标准,我要求在我的控制器中100%覆盖CRUD功能。我找到了一些Microsoft文档herehere和集成测试using SQLite,但我似乎仍然无法弄清楚单元测试。我也做了一些谷歌搜索,除了集成测试之外我找不到其他资源。

我是否可以通过某种方式直接使用EF Core进行单元测试,或者我必须制作存储库才能正确对该程序进行单元测试?

2 个答案:

答案 0 :(得分:6)

由于没有单独的存储库,因此不必对存储库进行单元测试;您无法对没有的内容进行单元测试。

通常使用EF Core测试的将是实际的数据库访问。为此,您可以使用in-memory database来临时设置数据库,以对其进行全面测试。当然,这比最小的单元测试更多是集成测试。

但是您应该考虑一下:编写单元测试时,您必须对要测试的内容有一个实际的了解。仅仅说“我需要对组件X进行单元测试”并没有真正的道理。通常,它更像是“我需要对组件X的方法U,W,Y进行单元测试”。因此,除非您实际上有需要测试的具有真实行为的方法,否则尝试为数据库上下文编写单元测试就没有任何意义。

您只想对自己编写的东西进行单元测试。如果什么都没有,例如因为您将直接数据库上下文功能用于CRUD,所以无需测试。 EF Core项目已经在单元测试方面进行了测试,您可能不想在这里开始进行第三方代码的单元测试。

答案 1 :(得分:2)

使用EF Core,您可以使用InMemoryDatabase,模拟DbContext的数据并针对该数据测试方法。

存储库添加了附加的抽象层,并使测试更加透明,但是也可以为单元测试注入带有模拟数据的DbContext。

Some code to illustrate an idea

别忘了检查InMemoryDatabase是否已传递到上下文,并且在这种情况下不要添加其他提供程序。

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("ConnectionString");
        }