En tant que compagnon de ma série de blogs sur .NET Mocking Frameworks et comment ils fonctionnent, ce référentiel tente d'implémenter les mêmes tests unitaires avec des simulations en utilisant chacun des principaux cadres moqueurs disponibles pour .NET.
Ce projet est destiné à être une référence pour quiconque cherche à comparer les frameworks de moquerie .NET ou à voir des exemples de syntaxe pour un cadre donné. Il n'est pas destiné à être une référence exhaustive, ce n'est pas le fait d'être sans bug (mais faites-moi savoir si vous trouvez des problèmes).
Pour rédiger des tests, nous avons besoin d'un code qui a besoin de tests. Ainsi, j'ai créé le LunchNotifier , un cours légèrement plus que du monde par rapport auquel les tests unitaires (avec des simulations) peuvent être écrits.
L'un des avantages accordés pour empiler les employés de débordement travaillant au bureau de New York est le déjeuner gratuit de chefs internes. Chaque jour, lorsque les cuisiniers ont terminé la préparation du repas, une notification va aux employés du bureau pour leur faire savoir que la nourriture est disponible.
Dans le projet CodeBeingTested , la classe LunchNotifier est notre objectif principal.
Cette classe TAKE a cinq dépendances externes qui doivent être moquées pour effectuer nos tests:
INotificationService (injecté via le constructeur)ILogger (injecté via le constructeur)IEmployeeService (injecté via le constructeur)IEmployee ) basés au bureau de New YorkIEmployee (retourné d' IEmployeeService )System.DateTime La logique principale est dans LunchNotifier.SendLunchtimeNotifications() . Cette méthode comprend un appel en ligne à System.DateTime.Now , qui n'est pas moquenable par des cadres en contrepoints comme le MOQ ou les rhinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Une autre implémentation est fournie pour une utilisation par des cadres en contrepoints dans LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() , où l'appel à DateTime.Now a été extrait dans sa propre méthode, qui peut être remplacée dans un faux:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Chacun des projets restants tente de mettre en œuvre un ensemble similaire de tests unitaires contre le LunchNotifier à l'aide de différents cadres moqueurs.
Tous les tests sont écrits à l'aide de NUnit V3.10 par package NuGet.
Dans certains cas, il existe plusieurs façons d'approcher un test en utilisant le cadre moqueur, j'ai donc fourni plusieurs variantes du test pour présenter les différentes approches.
Ce test crée un simulation de "bob" qui préfère les notifications par e-mail et utilise des simulations pour s'assurer que la logique LunchNotifier lui enverra un e-mail lorsque le déjeuner sera prêt.
Ce test crée deux employés simulés, "Bob" et "Martha" et garantit que si l'envoi d'une notification à l'un d'eux entraîne l'erreur enregistrée et n'empêche pas les employés restants d'être avertis.
Ce test utilise la syntaxe TestCase de Nunit pour exécuter deux cas de test, un pour avant 13 heures et un pour après 13 h, pour s'assurer que le modèle de notification approprié est utilisé en fonction de l'heure de la journée.
Pour les frameworks non contraints, DateTime.Now , peut être directement contrôlé pour renvoyer l'heure d'entrée du test, cependant, les frameworks contraints ne peuvent pas, ils doivent donc extraire l'appel vers DateTime.Now dans une méthode Speera et modifier le comportement de cette nouvelle méthode. Ainsi, la nécessité de la variante SendLunchtimeNotifications_DateTimeSeam .
Type: contraint
Projet: https://github.com/moq/moq4/wiki/quickstart
Nuget: https://www.nuget.org/packages/moq/
Type: contraint
Projet: https://github.com/hibernating-rhinos/rhino-mocks
Nuget: https://www.nuget.org/packages/rhinomocks
AVERTISSEMENT: Rhinomocks est effectivement un projet mort et ne fournira probablement pas de soutien aux changements futurs de .NET, tels que .NET Core. Je ne vous suggère pas de commencer à utiliser ce cadre si vous ne l'utilisez pas déjà.
Pour exécuter ces tests, vous devez installer VS2017 Enterprise (ou Equiv).
Type: contraint
Projet: http://nsubstitute.github.io/
Nuget: https://www.nuget.org/packages/nsubstitute
Type: sans contrainte
Microsoft Fakes fait partie de Visual Studio 2017 Enterprise ou Visual Studio 2015 Ultimate et n'est pas disponible en tant que composant Speera.
Fakes ne prend pas en charge nativement la validation de style AssertWasCalled , donc j'utilise un package NuGet supplémentaire (auquel j'ai contribué) pour fournir cette fonctionnalité: Fakes.Contrib / Nuget
Type: sans contrainte
Informations sur le produit: https://www.typemock.com/isolator
Ce produit nécessite une licence payante (il y a un essai gratuit de 15 jours) pour faire des moqueries sans contrainte. TypeMock était assez gentil pour me fournir une licence communautaire gratuite afin que je puisse travailler sur des projets comme celui-ci.