Moq für C# (.NET): Vollständiger Leitfaden mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist Moq und wozu wird es benötigt?

\n\n

Moq (ausgesprochen wie "Mock") ist eine beliebte Bibliothek zum Erstellen von Mock-Objekten (Stubs) in C# (.NET). Sie ist Teil des Ökosystems für Modultests und wird verwendet, um den zu testenden Code von seinen Abhängigkeiten zu isolieren.

\n\n

In realen Anwendungen sind Klassen oft von anderen Klassen abhängig: Datenbanken, Webdiensten, Dateisystemen, APIs von Drittanbietern. Beim Schreiben von Unit-Tests möchten wir diese externen Abhängigkeiten nicht testen – wir möchten nur die Logik unserer Klasse überprüfen. Moq ermöglicht es, "falsche" (Mock-)Objekte zu erstellen, die das Verhalten realer Abhängigkeiten nachahmen, aber vollständig vom Test kontrolliert werden.

\n\n

Hauptanwendungsfälle von Moq:

\n
    \n
  • Testisolierung: Testen einer einzelnen Klasse ohne Ausführen einer Datenbank oder externer Dienste.
  • \n
  • Überprüfung von Interaktionen: Sicherstellen, dass eine Methode mit den richtigen Argumenten und einer bestimmten Anzahl von Malen aufgerufen wurde.
  • \n
  • Festlegen von Rückgabewerten: Die Abhängigkeit dazu bringen, die benötigten Daten zur Überprüfung der Logik zurückzugeben.
  • \n
  • Simulation von Ausnahmen: Überprüfen, wie der Code Fehler von externen Systemen behandelt.
  • \n
\n\n

Moq arbeitet mit Schnittstellen und virtuellen Methoden von Klassen. Dies ist eine wesentliche Einschränkung: Sie können keine statische Methode oder nicht-virtuelle Methode mocken.

\n\n

Installation von Moq

\n\n

Moq wird über NuGet – den Paketmanager für .NET – verbreitet. Die Installation kann auf verschiedene Weise erfolgen:

\n\n

Über die .NET CLI (empfohlen)

\n
dotnet add package Moq
\n\n

Über die Package Manager Console (Visual Studio)

\n
Install-Package Moq
\n\n

Über die NuGet-Paketmanager-Benutzeroberfläche

\n

In Visual Studio: Rechtsklick auf das Projekt → NuGet-Pakete verwalten → Suche nach "Moq" → Installieren

\n\n

Anforderungen: .NET Framework 4.5+ oder .NET Core 2.0+ / .NET 5+

\n\n

Schnellstart: Erster Test mit Moq

\n\n

Angenommen, wir haben ein Repository-Interface und einen Service, der es verwendet:

\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

Jetzt schreiben wir einen Test mit 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

Erklärung des Beispiels:

\n
    \n
  1. new Mock<IUserRepository>() — Erstellt ein Mock-Objekt für das Interface.
  2. \n
  3. .Setup(...) — Konfiguriert das Verhalten: Bei Aufruf von GetUserById(1) den Benutzer Alice zurückgeben.
  4. \n
  5. mockRepo.Object — Ruft das "falsche" Objekt ab, das an den Service übergeben wird.
  6. \n
  7. mockRepo.Verify(...) — Überprüft, dass die Methode genau einmal aufgerufen wurde.
  8. \n
\n\n

Wichtige Methoden und Funktionen von Moq

\n\n

1. Mock<T>.Setup()

\n

Was es tut: Konfiguriert das Verhalten der Methode

Empfehlungen