ASP.NET Core 测试 - 在夹具中初始化 InMemory SQLite dbcontext 时获取 NullReferenceException

Posted

技术标签:

【中文标题】ASP.NET Core 测试 - 在夹具中初始化 InMemory SQLite dbcontext 时获取 NullReferenceException【英文标题】:ASP.NET Core Testing - get NullReferenceException when initializing InMemory SQLite dbcontext in fixture 【发布时间】:2020-02-25 23:02:22 【问题描述】:

我有一个测试夹具,我在其中初始化我的 SQLite 内存数据库上下文,如下所示:

public static MYAPPDBContext Create()

    var options = new DbContextOptionsBuilder<MYAPPDBContext>()
                    .UseSqlite("DataSource=:memory:")
                    .Options;
    var context = new MYAPPDBContext(options);

    context.Database.OpenConnection(); // this is where exception is thrown
    context.Database.EnsureCreated();

    return context;

当我调用 Create() 方法时,我得到以下 NullReferenceException:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=Microsoft.Data.Sqlite
  StackTrace:
   at Microsoft.Data.Sqlite.SqliteConnection.Open()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteRelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.<>c.<OpenConnection>b__15_0(DatabaseFacade database)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, Func`2 operation, Func`2 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation)
   at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.OpenConnection(DatabaseFacade databaseFacade)
   at MYAPPPlus.UnitTests.TestInfrastructure.MYAPPContextFactory.Create() in C:\websites\MYAPPPremier\tests\MYAPPPlus.UnitTests\TestInfrastructure\MYAPPContextFactory.cs:line 26
   at MYAPPPlus.UnitTests.TestInfrastructure.QueryTestFixture..ctor() in C:\websites\MYAPPPremier\tests\MYAPPPlus.UnitTests\TestInfrastructure\QueryTestFixture.cs:line 24

对可能发生的事情有什么想法吗?

仅供参考:我的代码基于https://garywoodfine.com/entity-framework-core-memory-testing-database/ 的博客文章以及其他资源。 此外,当使用基本的 ef core inmemory 数据库时,我的装置工作得很好。

【问题讨论】:

sqlite3.dll 在 bin 文件夹中吗? 另外,我一直将连接字符串视为数据源。 "数据源=:内存:" @terrencep 我相信您已经确定了连接字符串的问题。应该是Data Source=,这看起来像是文章中的错字。 【参考方案1】:

我在尝试为 Sqlite 数据库做 EF Core 脚手架时遇到了这个问题。问题是我安装了Microsoft.EntityFrameworkCore.Sqlite.Core 而不是Microsoft.EntityFrameworkCore.Sqlite

我卸载了以前的包,然后运行了这个命令:

Install-Package Microsoft.EntityFrameworkCore.Sqlite -Version 3.1.2

然后一切正常。 是的...

【讨论】:

我遇到了同样的问题,这对我也有用,非常感谢。有谁知道这两个 nuget 包会发生什么?它们的描述几乎相同...【参考方案2】:

我的错。当我需要 2.2.6 版时,我安装了 Microsoft.Data.Sqlite.Core 3.0.0 版,但我没有安装 Microsoft.Data.Sqlite 2.2.6,我已经安装了它。它现在正在工作。

另外,仅供参考:.UseSqlite("Data Source=:memory:") 和 .UseSqlite("DataSource=:memory:") 都有效。

【讨论】:

你能分享一下为什么你需要那个版本吗?打开 Sqlite 连接(没有实体框架)时,我也有一个 NPE 我遇到了同样的问题,并且在我安装了 nuget 包 Microsoft.Data.Sqlite 后它工作了。非常感谢您分享答案。【参考方案3】:

我在尝试打开 Microsoft.Data.Sqlite.SqliteConnection 时遇到了类似的问题,它也抛出了 System.NullReferenceException。初始化连接的类在库项目引用中:

Microsoft.Data.Sqlite - v3.1.2 Microsoft.Data.Sqlite.Core - v3.1.2

在这种情况下,可执行文件是 NUnit 测试,位于测试项目中。测试项目没有引用Sqlite NuGet 包,但它有一个对包含数据库逻辑的库的项目引用。在构建测试项目时,一些Sqlite dll 被复制到bin 目录,虽然不是全部,但最终结果是一个问题。在测试项目中添加对Sqlite NuGet 包的引用解决了这个问题。

【讨论】:

这对我帮助很大!谢谢【参考方案4】:

文章中好像有错别字。

DataSource 别名在这里不起作用,你必须使用"Data Source=:memory:"(带空格)

var options = new DbContextOptionsBuilder<MYAPPDBContext>()
    .UseSqlite("Data Source=:memory:") //<-- Note the space
    .Options;

参考Configuring a DbContext

【讨论】:

以上是关于ASP.NET Core 测试 - 在夹具中初始化 InMemory SQLite dbcontext 时获取 NullReferenceException的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET Core 和 Entity Framework Core 进行集成测试 - 如何在每次测试时恢复数据库中的测试数据?

如何在 ASP.NET Core 中测试 https 重定向?

在测试项目中使用 ASP.NET Core 的 ConfigurationBuilder

如何在 ASP.NET Core 中使用 ILogger 进行单元测试

如何对 ASP.NET Core 控制器或模型对象进行单元测试?

学习 ASP.NET Core 2.1:集成测试中使用 WebApplicationFactory