Moq et SqlConnection?
Je suis en train d'écrire des tests unitaires pour l'un de nos produits et ont été utilisés Moq pour réussir à se moquer de connexions à Entity Framework. Cependant, je suis venu à travers la méthode suivante:
public static productValue findValues(string productName, string dbConnectionString)
{
try
{
SqlConnection conn = new SqlConnection(dbConnectionString);
conn.Open();
//Do stuff
}
}
Qui permet d'accéder à notre base de données à l'intérieur de cette méthode à l'aide d'un passé chaîne de connexion. Est-il possible de créer une maquette DB à l'aide de Moq et de créer une chaîne de connexion qui pointe vers la moqué de DB? J'ai essayer de faire quelque chose le long des lignes de
var mockSqlConnnection = new Mock<SqlConnection>();
Si je ne suis pas sur si c'est la bonne approche, car ce serait se moquer de la connexion en elle-même plutôt que de la DB.
C'est n'est pas possible, je crois que SqlConnection est une classe scellée et ne peut donc pas être moqué. Vous pourrait se moquer de IDBConnection, mais il y aurait encore beaucoup à faire: si vous voulez de l'unité de tester cette méthode, vous pouvez avoir à refactoriser un peu.
Vous avez tout à fait raison, SqlConnection est une classe scellée
l'Une des meilleures façons d'obtenir de la base de données est votre façon de cacher les données d'accès derrière abstraction des interfaces qui peuvent être moqué dans une logique d'entreprise de test.
Vous avez tout à fait raison, SqlConnection est une classe scellée
l'Une des meilleures façons d'obtenir de la base de données est votre façon de cacher les données d'accès derrière abstraction des interfaces qui peuvent être moqué dans une logique d'entreprise de test.
OriginalL'auteur Novastorm | 2016-01-22
Vous devez vous connecter pour publier un commentaire.
J'ai eu un problème similaire.
J'ai introduit un
SqlDataContext
wrapper autour de l'occurrence de SqlConnection qui a hérité de etISqlDataContext
interface:Vous pouvez ajouter des surcharges à l'ISqlDataContext que vous en avez besoin.
Ce que cela signifie est que vous pouvez ensuite se moquer de l'ISqlDataContext comme l'exige l'utilisation Moq ou similaires et de retour se moquer de valeurs.
Signifie que vous pouvez ensuite tester votre dépôt ou toute autre chose qui frappe dans la base de données par le biais de l'occurrence de SqlConnection sans avoir à frapper, la base de données.
L'autre avantage est que vous pouvez injecter ISqlContext avec DI /Cio en tant que de besoin.
Bien que cette application va vous permettre de simuler la création de la IDataReader, vous avez maintenant une fuite de mise en œuvre qui va entraîner des messages d'erreur du genre "impossible d'obtenir une connexion à partir de la piscine" (stackoverflow.com/questions/15848239/...). C'est parce que vous n'êtes pas "l'élimination" de votre SqlConnection (ou SqlCommand). Je vous recommande également la mise en œuvre de l'interface IDisposable (msdn.microsoft.com/en-us/library/...) et de mettre une "aide" déclaration autour de votre utilisation de ce SqlDataContext objet.
J'apprécie le Cadre de l'Entité motif de l'appel de votre enveloppe (externe à votre gestionnaire de ressources). Si vous héritez d'une ISqlDataContext avec IDbConnection, vous obtiendrez IDisposable et plus large compatibilité.
OriginalL'auteur Graham
tard, mais pourquoi pas avec mstest:
vous devez ajouter une référence à System.Les données, puis ajouter un Faux.
https://msdn.microsoft.com/en-us/library/hh549175.aspx
Le mieux est, si vous changez la mise en œuvre et vous pouvez changer de lire de la couche mais ...
OriginalL'auteur tire0011
Ont un look à la Modèle De Référentiel, essentiellement, vous serait se moquer les données de votre consommation classes, plutôt que de s'inquiéter de la mise en œuvre de parler à la base de données.
Essentiellement, vous avez un référentiel
Qui est ensuite consommée dans d'autres classes:
Et utilisé comme:
L'exemple complet est dans le lien au dessus.
Alors vous voulez passer un moqué de dépôt dans votre classe:
Si il veut tester le référentiel?
OriginalL'auteur NikolaiDante