c# - 单元测试与集成测试 : Entity Framework Core In memory

标签 c# unit-testing asp.net-core entity-framework-core in-memory-database

我目前正在使用 EF Core 2.0 开发 ASP.NET Core 2.0 Web API。我计划实现 Repository + UnitOfWork 模式,并且我已经创建了抽象、接口(interface)等。由于我遵循 TDD 方法,我想在继续实现之前在这些接口(interface)上编写测试。

我面临的问题主要与语义有关。我在我的解决方案中创建了两个项目,一个用于单元测试,一个用于集成测试。对我来说很明显,同时测试数据库的测试不是单元测试,因此应该放在 IntegrationTests 项目中。问题是,我计划使用 EntityFrameworkCore.InMemory 提供程序并为每个测试启动一个假的内存数据库。

所以每个测试都应该有这样的结构:

[TestClass]
public class GamesRepositoryTest
{
    AppDbContext _context;
    IGamesRepository _repository;

    public GamesRepositoryTest()
    {

    }

    [TestInitialize]
    public void Initialize()
    {
        DbContextOptionsBuilder<AppDbContext> builder = new DbContextOptionsBuilder<AppDbContext>().UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString());
        _context = new AppDbContext(builder.Options);
        _repository = new GamesRepository(_context);
    }

    [TestCleanup]
    public void Cleanup()
    {
        _context.Database.EnsureDeleted();
    }
}

所以我的问题是,EntityFrameworkCore.InMemory 是否提供了足够的抽象级别,以便可以将上述类视为单元测试,或者我应该将它放在 IntegrationTests 项目中吗?

最佳答案

新的in-memory provider把大家的脑洞塞出来了。首先,让我们弄清楚它的目的:它是一个测试数据提供者。就是这样。您可以轻松模拟 DbContext 并返回静态列表或其他内容。内存中提供程序只是为您提供了一种更简单的方法来设置该测试脚手架。它不适合集成测试,因为您实际上不会在生产中使用它。适当的集成测试会触及您的生产设置的真实副本。

也就是说,Entity Framework Core 的新内存提供程序的主要问题是现在人们似乎在滥用它来测试他们不应该测试的东西。 EF Core 已经过良好测试,因此您应该只测试您的 应用程序代码。同样,只需将其视为模拟,而无需实际设置模拟。只要您这样做,就应该没问题。

基于所有这些,为了回答您的问题,您的测试应该是单元测试,如果除了您实际创建集成测试之外没有其他原因,您不应该使用内存提供程序。只需确保您确实在进行单元测试。

关于c# - 单元测试与集成测试 : Entity Framework Core In memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47056392/

相关文章:

c# - 计算列表数组中非空元素的数量

c# - Asp.net 身份过期 session Cookie

c# - .net core 3 preview 8 升级后 React SPA/Embedded Identity Server 问题

reactjs - Asp.Net Core Api 授权

c# - 无法解析方法 Sum

ruby-on-rails - 如何在 Rails 测试中用 proc 和 yield 覆盖类?

unit-testing - Qunit 测试位于包含多个 Controller 的文件中的 ember Controller ?

python - 如何将 PyMock 和 Nose 与 Django 模型结合使用?

c# - 如何在 Mac OS X 上的 VSCode 项目中包含 'System.Runtime.Serialization.Json' 命名空间?

c# - 将嵌套对象保存到 .Net 中的 Realm 数据库