Was ist Moq und wozu wird es benötigt?
\n\nMoq (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\nIn 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\nHauptanwendungsfä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
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\nInstallation von Moq
\n\nMoq wird über NuGet – den Paketmanager für .NET – verbreitet. Die Installation kann auf verschiedene Weise erfolgen:
\n\nÜber die .NET CLI (empfohlen)
\ndotnet add package Moq\n\nÜber die Package Manager Console (Visual Studio)
\nInstall-Package Moq\n\nÜber die NuGet-Paketmanager-Benutzeroberfläche
\nIn Visual Studio: Rechtsklick auf das Projekt → NuGet-Pakete verwalten → Suche nach "Moq" → Installieren
\n\nAnforderungen: .NET Framework 4.5+ oder .NET Core 2.0+ / .NET 5+
\n\nSchnellstart: Erster Test mit Moq
\n\nAngenommen, wir haben ein Repository-Interface und einen Service, der es verwendet:
\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\nJetzt schreiben wir einen Test mit 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\nErklärung des Beispiels:
\n- \n
new Mock<IUserRepository>()— Erstellt ein Mock-Objekt für das Interface. \n .Setup(...)— Konfiguriert das Verhalten: Bei Aufruf vonGetUserById(1)den Benutzer Alice zurückgeben. \n mockRepo.Object— Ruft das "falsche" Objekt ab, das an den Service übergeben wird. \n mockRepo.Verify(...)— Überprüft, dass die Methode genau einmal aufgerufen wurde. \n
Wichtige Methoden und Funktionen von Moq
\n\n1. Mock<T>.Setup()
\nWas es tut: Konfiguriert das Verhalten der Methode
Auch in der Bibliothek
PDF-Generierung in Java mit iText
Maschinelles Lernen: TypeScript-Bibliotheken für Browser und Node.js
Aufgabenwarteschlangen in TypeScript: Überblick über Bibliotheken und Implementierung