ASP.NET Core Testing - получить исключение NullReferenceException при инициализации InMemory SQLite dbcontext в фикстуре - PullRequest
2 голосов
/ 30 октября 2019

У меня есть тестовое устройство, в котором я инициализирую свой dbcontext в памяти 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.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Мой плохой. Я установил Microsoft.Data.Sqlite.Core версии 3.0.0, когда мне была нужна версия 2.2.6, и я не установил Microsoft.Data.Sqlite 2.2.6, которую я установил с тех пор. Это работает сейчас.

Кроме того, к вашему сведению: оба .UseSqlite ("Источник данных =: память:") и .UseSqlite ("DataSource =: память:") работают.

1 голос
/ 30 октября 2019

Похоже, что в статье была опечатка.

Псевдоним DataSource здесь не работает, вы должны использовать "Data Source=:memory:" (с пробелом)

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

Ссылка Настройка DbContext

...