web-dev-qa-db-ja.com

ASP.NETコアテスト-フィクスチャでInMemory SQLite dbcontextを初期化するとNullReferenceExceptionが発生する

以下に示すように、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/ のブログ投稿を基にコードを作成しています。また、基本的なefコアのインメモリデータベースを使用すると、私のフィクスチャは問題なく動作します。

6

Microsoft.Data.Sqlite.SqliteConnectionを開こうとしたときにも同様の問題があり、System.NullReferenceExceptionもスローしていました。接続を初期化していたクラスは、ライブラリプロジェクト参照にありました:

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

この場合の実行可能ファイルは、テストプロジェクトにあるNUnit testでした。テストプロジェクトはSqlite NuGetパッケージを参照していませんでしたが、データベースロジックを含むライブラリへのプロジェクト参照がありました。テストプロジェクトのビルド中に、一部のSqlite dllがbinディレクトリにコピーされましたが、すべてではありませんでしたが、結局問題であることが判明しました。テストプロジェクトで両方のSqlite NuGetパッケージへの参照を追加すると、問題が解決しました。

1
Aivaras

記事にタイプミスがあったようです。

DataSourceエイリアスはここでは機能しません。"Data Source=:memory:"を使用する必要があります(スペース付き)

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

リファレンス DbContextの構成

1
terrencep