Comment Moq Entity Framework SqlQuery appels
J'ai été en mesure de se moquer de DbSet
'partir de entity framework avec Moq à l'aide de cette lien.
Cependant, maintenant, j'aimerais savoir comment je pourrait se moquer de l'appel à SqlQuery. Vous ne savez pas si c'est possible ou comment, puisqu'il repose sur la moqué db contexte de savoir ce que le "requête" est appelé.
Ci-dessous est ce que je suis en train d'essayer de se moquer.
var myObjects = DbContext.Database
.SqlQuery<MyObject>("exec [dbo].[my_sproc] {0}", "some_value")
.ToList();
Actuellement, je n'ai pas essayé tout ce que ne sais pas comment commencer à se moquant de cet exemple.
Les moqueries de la DbSet
est ci-dessous et de les ré-itérer, je peut correctement se moquer de retour d'un DbSet
de MyObject
mais maintenant suis en train de simuler une SqlQuery qui retourne une liste de MyObject
's.
var dbContext = new Mock<MyDbContext>();
dbContext.Setup(m => m.MyObjects).Returns(mockObjects.Object);
dbContext.Setup(m => m.Database.SqlQuery... something along these lines
Vous devez vous connecter pour publier un commentaire.
Base de données.SqlQuery<T>
n'est pas marqué comme virtuel, maisSet<T>.SqlQuery
est marqué comme virtuel.Basé sur
Base de données.SqlQuery<T>
documentationet
Set<T>.SqlQuery
documentationpuis le
Database.SqlQuery<T>(String, Object[])
doit être équivalent avecSet<T>.SqlQuery(String, Object[]).AsNoTracking()
(seulement siT
est EF entité, pas un DTO /VM).Donc, si vous pouvez remplacer la mise en œuvre en:
vous pouvez en moquer comme de suivre
La
Base
propriété etSqlQuery
méthode ne sont pas marqués commevirtual
de sorte qu'ils ne peut pas être moqué (à l'aide de Moq; vous pourriez utiliser un différents bibliothèque qui peuvent rendre compte de ce mais qui peut être plus d'inertie que vous souhaitez).Vous auriez besoin d'utiliser une sorte d'abstraction pour contourner ce problème, comme en l'enveloppant l'ensemble de la requête de la base de données dans une classe helper:
Maintenant la méthode de test devient:
Alors il faudrait injecter de l'
IQueryHelper
dans le constructeur de la classe que vous faites des tests et des simulations qui.Vous allez être absent de la couverture de test sur
DoYourQuery
, mais maintenant la requête est si simple, il y a évidemment pas de carences.Vous pouvez ajouter une méthode virtuelle à votre contexte de base de données que vous pouvez modifier dans les tests unitaires:
N'importe qui devrait venir à travers de ce. J'ai résolu ce problème avec un peu d'approches. Juste une autre façon d'aborder cette question.
Mon contexte est extrait par l'intermédiaire d'un interface. J'ai seulement besoin de quelques méthodes:
}
Tous mes accès de base de données est par le biais de méthodes asynchrones. Qui apporte une toute nouvelle série de problèmes lorsqu'ils tentent de s'en moquer. Heureusement, il a été répondu à ici. L'exception que vous obtenez est liée à défaut de se moquer de IDbAsyncEnumerable. À l'aide de la solution fournie - je vient de prolonger un peu plus, de sorte que j'ai eu de l'aide pour retourner un Mock> objet qui se moquaient de toutes les propriétés attendues.
Enfin - à l'aide de la solution fournie par @Yulium Chandra - mon analyse des matières premières SQL avec moqué contexte ressemble: