使用 EF Core 2.0 时的单元测试

Unit Testing when using EF Core 2.0

对于我在实习期间所做的项目,我们必须使用存储库模式。由于该项目已经在使用 EF Core,而且我读到在底层实现中已经有存储库和工作单元。我想我会直接使用 EF Core 方法而不实现存储库 类,因为我想防止混乱。

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

有什么方法可以直接使用 EF Core 进行单元测试,还是我必须创建存储库才能正确地对该程序进行单元测试?

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

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

Some code to illustrate an idea

只是不要忘记检查 InMemoryDatabase 是否已传递给上下文,在这种情况下不要添加其他提供程序。

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

Tip

如果您正在使用 ASP.NET 核心,那么您不需要此代码,因为您的数据库提供程序已经在上下文之外配置(在 Startup.cs 中)。

由于您没有单独的存储库,因此不必对存储库进行单元测试;你不能对你没有的东西进行单元测试。

您通常使用 EF Core 测试的是实际的数据库访问。为此,您可以使用 in-memory database 临时设置您的数据库,您可以 运行 对其进行完整测试。当然,这更像是一个集成测试,而不是最小的单元测试。

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

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