2017-09-06 2 views
1

L'une de mes routes API utilise une commande SQL merge into pour effectuer une opération atomique upsert, et dans mes tests automatisés, j'ai une instance TestServer qui utilise la commande in -memory fournisseur db. Cela me donne une erreur, probablement parce que le fournisseur en mémoire ne supporte pas l'exécution des commandes raw sql - est-ce vrai? Si non, comment puis-je le faire fonctionner?SQL statique avec EF Core et fournisseur db en mémoire

est ici la classe Startup pour les tests:

// In memory DB for testing 
services.AddDbContext<MyContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("stuff")); 
services.AddDbContext<MyStatusContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("status")); 
services.AddDbContext<MyUserRolesContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("userroles")); 

Et le code de l'API est que vous attendez:

var count = await context.Database.ExecuteSqlCommandAsync(@"merge into ...", default(CancellationToken), ...); 
return count; 

Ce code fonctionne très bien dans la production contre une véritable base de données, je viens ne peut pas le faire fonctionner avec le fournisseur en mémoire dans mes tests. Y a t-il le moindre espoir pour moi? Quelle est la stratégie de test habituelle pour les scripts SQL personnalisés?

+0

Notez également que les 3 contextes pointent tous vers la même base de données réelle, nous avons simplement des contextes distincts dans le code pour différents domaines (ensembles de tables). – gzak

Répondre

1

Il n'y a aucun espoir pour vous, car le fournisseur InMemory est un fournisseur non-relationnel NoSQL. Vous devez utiliser SQL Server (par exemple localdb) pour les tests d'intégration.