在内存数据库中使用ef核心进行测试

时间:2017-10-11 07:11:19

标签: entity-framework ef-core-2.0

我在项目中使用ef核心,我的存储库调用存储过程来获取结果。我想知道我是否可以使用ef core的内存数据库功能来测试我的存储库。

1 个答案:

答案 0 :(得分:0)

你可以,但你不应该这样做。来自微软:

<块引用>

EF Core 附带一个内存数据库,我们用于内部 EF Core 本身的测试。这个数据库一般不适合 用于测试使用 EF Core 的应用程序。具体:

  • 它不是关系数据库。
  • 它不支持交易。
  • 它无法运行原始 SQL 查询。
  • 未针对性能进行优化。

在测试 EF Core 内部时,这些都不是很重要,因为 我们专门在数据库与测试无关的地方使用它。 另一方面,这些东西在测试时往往非常重要 使用 EF Core 的应用程序。

https://docs.microsoft.com/en-us/ef/core/testing/#approach-3-the-ef-core-in-memory-database

Microsoft 建议改用 SQLite 内存数据库。永远记住它的生命周期:

  • 数据库在打开连接时创建
  • 数据库在与数据库的连接关闭时被删除

示例:

public class SqliteInMemoryItemsControllerTest : ItemsControllerTest, IDisposable
{
    private readonly DbConnection _connection;

    public SqliteInMemoryItemsControllerTest()
        : base(
            new DbContextOptionsBuilder<ItemsContext>()
                .UseSqlite(CreateInMemoryDatabase())
                .Options)
    {
        _connection = RelationalOptionsExtension.Extract(ContextOptions).Connection;
    }

    private static DbConnection CreateInMemoryDatabase()
    {
        var connection = new SqliteConnection("Filename=:memory:");

        connection.Open();
        
        return connection;
    }

    public void Dispose() => _connection.Dispose();
}

https://docs.microsoft.com/en-us/ef/core/testing/sqlite#using-sqlite-in-memory-databases