Bei der Verwendung eines Mocking-Framework?
So Spiele ich, um mit mocking frameworks (Moq) für meine unit-tests, und Frage mich, wenn Sie verwenden sollten, ein mocking framework?
Was ist der Vorteil/Nachteil zwischen den beiden folgenden tests:
public class Tests
{
[Fact]
public void TestWithMock()
{
//Arrange
var repo = new Mock<IRepository>();
var p = new Mock<Person>();
p.Setup(x => x.Id).Returns(1);
p.Setup(x => x.Name).Returns("Joe Blow");
p.Setup(x => x.AkaNames).Returns(new List<string> { "Joey", "Mugs" });
p.Setup(x => x.AkaNames.Remove(It.IsAny<string>()));
//Act
var service = new Service(repo.Object);
service.RemoveAkaName(p.Object, "Mugs");
//Assert
p.Verify(x => x.AkaNames.Remove("Mugs"), Times.Once());
}
[Fact]
public void TestWithoutMock()
{
//Arrange
var repo = new Mock<IRepository>();
var p = new Person { Id = 1, Name = "Joe Blow", AkaNames = new List<string> { "Joey", "Mugs" } };
//Act
var service = new Service(repo.Object);
service.RemoveAkaName(p, "Mugs");
//Assert
Assert.True(p.AkaNames.Count == 1);
Assert.True(p.AkaNames[0] == "Joey");
}
}
- Spott erlaubt Ihnen die Steuerung aller Variablen, Sie sind NICHT testen, so dass Sie nur testen ein Stück Programmcode.
- +1 paqogomez, in anderen Worten, Spott ermöglicht Ihnen, zu isolieren, die unter code-test, so dass Sie nur testen, einen bestimmten code-Stück. der Vorteil ist, dass eine rot-oder grün-test-Ergebnis zeigt an, welcher Teil der code falsch ist. Sie in der Regel mock-Dienste aber oft mehr. hier jedoch, eine person wird kaum erfordern wird verspottet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden mock-Objekte wirklich erstellen einer unit test-ein test, wo alle Abhängigkeiten sind davon ausgegangen, korrekt zu funktionieren und alles, was Sie wissen wollen, ob das SUT (system unter test--eine ausgefallene Art zu sagen, die Klasse, die Sie testen) funktioniert.
Den mock-Objekte helfen, die "Garantie" Ihre Abhängigkeiten korrekt funktionieren, weil Sie erstellen mock-Versionen der Abhängigkeiten, die Ergebnisse erzielen, die Sie konfigurieren. Die Frage wird dann, wenn die eine Klasse, die Sie testen wollen verhält sich so, wie es sollte, wenn alles andere ist "arbeiten".
Mock-Objekte sind besonders kritisch, wenn Sie testen ein Objekt mit einem langsamen Abhängigkeit--wie eine Datenbank oder einen web-service. Wenn Sie waren wirklich der hit-Datenbank oder machen die den echten web-service-Aufruf, Ihre Prüfung viel mehr Zeit zu laufen. Das ist erträglich, wenn es nur ein paar Sekunden, aber wenn Sie haben Hunderte von tests ausgeführt, die in einem continuous integration server, das summiert sich wirklich schnell und Krüppel Ihre Automatisierung.
Dies ist, was wirklich macht die mock-Objekte wichtig-die Verringerung der build-test-deploy-Zyklus-Zeit. Sicherstellen, dass die tests schnell laufen, ist entscheidend für effiziente software-Entwicklung.
Gibt es einige Regeln, die ich verwenden schreiben von unit-tests.
dann ich verspotte Sie alle.
überprüfen Sie das Ergebnis nur. Wenn Abhängigkeiten als Parameter übergeben werden der Methode sollten Sie verspottet. (siehe 1.)
Es ist ein Alter Artikel von Martin Fowler Mocks Aren ' T Stubs.
Im ersten test verwenden Sie Verspotten und in die zweite ein, die Sie verwenden Stub.
Auch ich sehe einige design-Probleme, die dazu führen, dass Ihre Frage stellen.
Wenn es erlaubt ist, zu entfernen
AkaName
ausAkaNames
Sammlung, dann ist es OK stub und prüfen Zustand der person. Wenn Sie spezifische Methodevoid RemoveAkaName(string name)
inPerson
Klasse dann spottet, sollte verwendet werden, um zu überprüfen, seine Berufung. Und die Logik derRemoveAkaName
sollte getestet werden, als Teil derPerson
Klasse testen.Ich würde stub für
product
- und mock fürrepository
für Sie code.Das mocking-framework wird verwendet, um entfernen die Abhängigkeit, damit der unit-test wird der Schwerpunkt auf die "Einheit" getestet werden. In Ihrem Fall, die person, die aussieht wie eine einfache entity-Klasse gibt es keine Notwendigkeit zu verwenden Spott für ihn.
Spott hat viele Vorteile besonders in der agilen Softwareentwicklung, wo viele schnelle release-Zyklen bedeutet, dass sytem Verteilung und die realen Daten sind möglicherweise unvollständig. In solchen Fällen können Sie ein mock-repository zu imitieren, production code, um weiterhin arbeiten auf-ui oder-Dienste. Dies ist in der Regel ergänzt mit einer IoC-Mechanismus wie Ninject zu vereinfachen der Wechsel auf die real-repositories. Die beiden Beispiele, die Sie geben, sind gleich und ohne weiteren Kontext würde ich sagen, es ist eine Frage der Wahl zwischen Ihnen. Die fluent-api, die moq ist leichter zu Lesen als seine Art sich selbst zu dokumentieren. Das ist meine Meinung, obwohl 😉
Mock wird verwendet, um test-Objekt, das funktioniert nicht in isolation. angenommen, Eine Funktion ist abhängig von Funktion B, zum durchführen von unit-Tests auf die Funktion Ein, die wir am Ende sogar bis Test-Funktion B.By mit mock simulieren Sie die Funktionsweise der Funktion B und Tests konzentrierte sich nur auf die Funktion A.
Einem mocking framework ist nützlich für die Simulation der integration Punkte in den code, unter test. Ich würde argumentieren, dass dein konkretes Beispiel ist nicht ein guter Kandidat für ein mocking-framework wie bereits inject dependency (Person) direkt in den code. Mit einem mocking framework tatsächlich erschwert es in diesem Fall.
Eine viel bessere Verwendung Fall ist, wenn Sie ein repository einen Aufruf zu einer Datenbank. Es ist wünschenswert, von einem unit-test Sicht zu verspotten, die db-call-und return festgelegten Daten statt. Die wesentlichen Vorteile dieser ist die Beseitigung von Abhängigkeiten auf Daten verlassen, sondern auch die Leistung, da die db aufrufen, wird langsam der test down.