web-dev-qa-db-fra.com

Tests ASP.NET Core - obtenez NullReferenceException lors de l'initialisation de dbcontext InMemory SQLite dans le luminaire

J'ai un appareil de test dans lequel j'initialise mon dbcontext SQLite en mémoire, illustré ci-dessous:

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;
}

Lorsque j'appelle la méthode Create (), j'obtiens l'exception NullReferenceException suivante:

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

Des idées sur ce qui pourrait se passer?

Pour info: je fonde mon code sur le billet de blog à https://garywoodfine.com/entity-framework-core-memory-testing-database/ , entre autres ressources. En outre, mon appareil fonctionne très bien lors de l'utilisation de la base de données inmemory de base ef core.

6
Laurie Dickinson

J'ai rencontré un problème similaire lors de l'ouverture de Microsoft.Data.Sqlite.SqliteConnection, il jetait System.NullReferenceException ainsi que. La classe qui initialisait la connexion était en référence au projet de bibliothèque:

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

Dans ce cas, l'exécutable était le test NUnit, situé dans le projet de test. Le projet de test n'avait pas de packages NuGet Sqlite référencés, mais il contenait une référence de projet à la bibliothèque contenant la logique de la base de données. Lors de la construction du projet de test, certaines DLL Sqlite ont été copiées dans le répertoire bin, mais pas toutes, ce qui s'est finalement avéré être un problème. L'ajout d'une référence aux deux packages NuGet Sqlite dans le projet de test a résolu le problème.

1
Aivaras

On dirait qu'il y avait une faute de frappe dans l'article.

L'alias DataSource ne fonctionne pas ici, vous devez utiliser "Data Source=:memory:" (avec un espace)

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

Référence Configuration d'un DbContext

1
terrencep