ASP.NET 核心测试 - 在 fixture 中初始化 InMemory SQLite dbcontext 时出现 NullReferenceException
ASP.NET Core Testing - get NullReferenceException when initializing InMemory SQLite dbcontext in fixture
我有一个测试夹具,我在其中初始化我的 SQLite 内存中 dbcontext,如下所示:
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/ 上的博客 post,以及其他资源。
此外,在内存数据库中使用基本的 ef 核心时,我的夹具工作得很好。
文章中似乎有错别字。
DataSource
别名在这里不起作用,您必须使用 "Data Source=:memory:"
(带有 space)
var options = new DbContextOptionsBuilder<MYAPPDBContext>()
.UseSqlite("Data Source=:memory:") //<-- Note the space
.Options;
我的错。当我需要版本 2.2.6 时,我已经安装了 Microsoft.Data.Sqlite.Core 版本 3.0.0,但我没有安装 Microsoft.Data.Sqlite 2.2.6,我已经安装了它。现在可以使用了。
此外,仅供参考:.UseSqlite("Data Source=:memory:") 和 .UseSqlite("DataSource=:memory:") 都有效。
我在尝试为 Sqlite 数据库构建 EF Core 脚手架时遇到了这个问题。问题是我安装了 Microsoft.EntityFrameworkCore.Sqlite.Core
而不是 Microsoft.EntityFrameworkCore.Sqlite
.
我卸载了之前的包,运行这个命令:
Install-Package Microsoft.EntityFrameworkCore.Sqlite -Version 3.1.2
然后一切正常。
是的...
我在尝试打开 Microsoft.Data.Sqlite.SqliteConnection
时遇到了类似的问题,它也抛出了 System.NullReferenceException
。正在初始化连接的 class 在库项目中引用:
Microsoft.Data.Sqlite
- v3.1.2
Microsoft.Data.Sqlite.Core
- v3.1.2
本例中的可执行文件是 NUnit
测试,位于测试项目中。测试项目没有引用 Sqlite
个 NuGet 包,但它有一个对包含数据库逻辑的库的项目引用。在构建测试项目时,一些 Sqlite
dll 被复制到 bin
目录,虽然不是全部,但最终证明这是一个问题。在测试项目中添加对两个 Sqlite
NuGet 包的引用解决了这个问题。
我有一个测试夹具,我在其中初始化我的 SQLite 内存中 dbcontext,如下所示:
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/ 上的博客 post,以及其他资源。 此外,在内存数据库中使用基本的 ef 核心时,我的夹具工作得很好。
文章中似乎有错别字。
DataSource
别名在这里不起作用,您必须使用 "Data Source=:memory:"
(带有 space)
var options = new DbContextOptionsBuilder<MYAPPDBContext>()
.UseSqlite("Data Source=:memory:") //<-- Note the space
.Options;
我的错。当我需要版本 2.2.6 时,我已经安装了 Microsoft.Data.Sqlite.Core 版本 3.0.0,但我没有安装 Microsoft.Data.Sqlite 2.2.6,我已经安装了它。现在可以使用了。
此外,仅供参考:.UseSqlite("Data Source=:memory:") 和 .UseSqlite("DataSource=:memory:") 都有效。
我在尝试为 Sqlite 数据库构建 EF Core 脚手架时遇到了这个问题。问题是我安装了 Microsoft.EntityFrameworkCore.Sqlite.Core
而不是 Microsoft.EntityFrameworkCore.Sqlite
.
我卸载了之前的包,运行这个命令:
Install-Package Microsoft.EntityFrameworkCore.Sqlite -Version 3.1.2
然后一切正常。 是的...
我在尝试打开 Microsoft.Data.Sqlite.SqliteConnection
时遇到了类似的问题,它也抛出了 System.NullReferenceException
。正在初始化连接的 class 在库项目中引用:
Microsoft.Data.Sqlite
- v3.1.2Microsoft.Data.Sqlite.Core
- v3.1.2
本例中的可执行文件是 NUnit
测试,位于测试项目中。测试项目没有引用 Sqlite
个 NuGet 包,但它有一个对包含数据库逻辑的库的项目引用。在构建测试项目时,一些 Sqlite
dll 被复制到 bin
目录,虽然不是全部,但最终证明这是一个问题。在测试项目中添加对两个 Sqlite
NuGet 包的引用解决了这个问题。