Qu'est-ce que Moq et pourquoi en a-t-on besoin ?
\n\nMoq (prononcé "Mok") est une bibliothèque populaire pour créer des objets mock (simulateurs) en C# (.NET). Elle fait partie de l'écosystème des tests unitaires et est utilisée pour isoler le code testé de ses dépendances.
\n\nDans les applications réelles, les classes dépendent souvent d'autres classes : bases de données, services web, système de fichiers, API de services tiers. Lors de l'écriture de tests unitaires, nous ne voulons pas tester ces dépendances externes — nous voulons uniquement vérifier la logique de notre classe. Moq permet de créer des objets "factices" (mock) qui imitent le comportement des dépendances réelles, tout en étant entièrement contrôlés par le test.
\n\nScénarios d'utilisation principaux de Moq :
\n- \n
- Isolation des tests : tester une classe sans lancer de base de données ou de services externes. \n
- Vérification des interactions : s'assurer qu'une méthode a été appelée avec les bons arguments, un nombre de fois déterminé. \n
- Définition des valeurs de retour : forcer une dépendance à retourner les données nécessaires pour vérifier la logique. \n
- Simulation d'exceptions : vérifier comment le code gère les erreurs provenant de systèmes externes. \n
Moq fonctionne avec les interfaces et les méthodes virtuelles des classes. C'est une limitation clé : vous ne pouvez pas simuler une méthode statique ou une méthode non virtuelle.
\n\nInstallation de Moq
\n\nMoq est distribué via NuGet — le gestionnaire de paquets pour .NET. Il peut être installé de plusieurs manières :
\n\nVia .NET CLI (recommandé)
\ndotnet add package Moq\n\nVia la console du gestionnaire de paquets (Visual Studio)
\nInstall-Package Moq\n\nVia l'interface utilisateur du gestionnaire de paquets NuGet
\nDans Visual Studio : Clic droit sur le projet → Gérer les paquets NuGet → Rechercher "Moq" → Installer
\n\nPrérequis : .NET Framework 4.5+ ou .NET Core 2.0+ / .NET 5+
\n\nDémarrage rapide : premier test avec Moq
\n\nSupposons que nous ayons une interface de dépôt et un service qui l'utilise :
\n\npublic interface IUserRepository\n{\n User GetUserById(int id);\n void SaveUser(User user);\n}\n\npublic class UserService\n{\n private readonly IUserRepository _repository;\n\n public UserService(IUserRepository repository)\n {\n _repository = repository;\n }\n\n public string GetUserName(int userId)\n {\n var user = _repository.GetUserById(userId);\n return user?.Name ?? "Unknown";\n }\n}\n\npublic class User\n{\n public int Id { get; set; }\n public string Name { get; set; }\n}\n\nÉcrivons maintenant un test utilisant Moq :
\n\nusing Moq;\nusing Xunit;\n\npublic class UserServiceTests\n{\n [Fact]\n public void GetUserName_WhenUserExists_ReturnsUserName()\n {\n // Arrange\n var mockRepo = new Mock<IUserRepository>();\n mockRepo.Setup(repo => repo.GetUserById(1))\n .Returns(new User { Id = 1, Name = "Alice" });\n\n var service = new UserService(mockRepo.Object);\n\n // Act\n var result = service.GetUserName(1);\n\n // Assert\n Assert.Equal("Alice", result);\n mockRepo.Verify(repo => repo.GetUserById(1), Times.Once);\n }\n}\n\nAnalyse de l'exemple :
\n- \n
new Mock<IUserRepository>()— crée un objet mock pour l'interface. \n .Setup(...)— configure le comportement : lors de l'appel àGetUserById(1), retourner l'utilisateur Alice. \n mockRepo.Object— obtient l'objet "factice" que l'on passe au service. \n mockRepo.Verify(...)— vérifie que la méthode a été appelée exactement une fois. \n
Méthodes et fonctions principales de Moq
\n\n1. Mock<T>.Setup()
\nCe qu'elle fait : Configure le comportement de la mé
Aussi dans la bibliothèque
Travail avec les dates en Swift (iOS/macOS) : bibliothèques et frameworks
Travailler avec XML en Go (Golang) : la bibliothèque standard encoding/xml
Kysely TypeScript : guide complet du query builder type-safe
Scrutor C# (.NET) : guide complet avec exemples
Traitement d'images en Kotlin : redimensionnement et recadrage avec la bibliothèque Kamel