Moq pour C# (.NET) : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que Moq et pourquoi en a-t-on besoin ?

\n\n

Moq (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\n

Dans 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\n

Scé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
\n\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\n

Installation de Moq

\n\n

Moq est distribué via NuGet — le gestionnaire de paquets pour .NET. Il peut être installé de plusieurs manières :

\n\n

Via .NET CLI (recommandé)

\n
dotnet add package Moq
\n\n

Via la console du gestionnaire de paquets (Visual Studio)

\n
Install-Package Moq
\n\n

Via l'interface utilisateur du gestionnaire de paquets NuGet

\n

Dans Visual Studio : Clic droit sur le projet → Gérer les paquets NuGet → Rechercher "Moq" → Installer

\n\n

Prérequis : .NET Framework 4.5+ ou .NET Core 2.0+ / .NET 5+

\n\n

Démarrage rapide : premier test avec Moq

\n\n

Supposons que nous ayons une interface de dépôt et un service qui l'utilise :

\n\n
public 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\n
using 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\n

Analyse de l'exemple :

\n
    \n
  1. new Mock<IUserRepository>() — crée un objet mock pour l'interface.
  2. \n
  3. .Setup(...) — configure le comportement : lors de l'appel à GetUserById(1), retourner l'utilisateur Alice.
  4. \n
  5. mockRepo.Object — obtient l'objet "factice" que l'on passe au service.
  6. \n
  7. mockRepo.Verify(...) — vérifie que la méthode a été appelée exactement une fois.
  8. \n
\n\n

Méthodes et fonctions principales de Moq

\n\n

1. Mock<T>.Setup()

\n

Ce qu'elle fait : Configure le comportement de la mé

Recommendations