Wie kann ich simulieren Sie eine Schnittstelle mit Moq oder NInject-Kernel Spott
Ich nur watete durch Fragen und blogs über das Thema mocking und Dependency Injection. Zu einem Ergebnis kommen, ich brauche nur zu verspotten, die Schnittstelle, die verbraucht wird, durch den Kunden. Ich freue mich auf das testen einer einfachen Anwendungsfall hier mit keine Ahnung.
Der Vertrag
public Interface IApplicationService
{
bool DeleteApplication(int id);
ApplicationDto AddApplication(ApplicationDto application);
IEnumerable<ApplicationDto> GetApplications();
}
Umsetzung ( ich werde mock )
public Class ApplicationService:IApplicationService
{
private EntityFrameworkRepo repo;
public ApplicationService()
{
repo = new EntityFrameworkRepo();
}
public ApplicationDto Add(ApplicationDto dto)
{
//add to dbcontext and commit
}
}
Spott Code
[Test(Description = "Test If can successfully add application")]
public void CanAddApplication()
{
//create a mock application service
var applicationService = new Mock<IApplicationService>();
//create a mock Application Service to be used by business logic
var applicationDto = new Mock<ApplicationDto>();
//How do i set this up
applicationService.Setup(x => x.GetApplications()).Returns(IEnumerable<applicationDto.Object>);
}
Und ich bin sicher, ich brauche zum testen der business Logik eher als lustig. Also, was ist es genau ich tun muss, um zu testen, meine ApplicationService
aber dann halten Sie das entity framework aus.
btw zu sprechen ApplicationService
es nutzt die constructor injection mit NInject. So spotten diese mit NInject.MockingKernel
setup Abhängigkeit Kette?
- Es sieht aus wie Sie sind ein wenig verwirrt zwischen testing und mocking. Sollten Sie nicht verhöhnen die Klasse, die Sie möchten, um zu testen, nur seine Abhängigkeiten.
- Genau 🙂 ich bin verwirrt. Also in meinem Fall, was soll ich eigentlich verspotten ? und jeder code, weiter zu erklären würde wirklich helfen, mich durch
- Ich bin nicht vertraut mit ninject, so kann ich dir nicht helfen, aber es sieht aus wie Sie sollen erstellen Sie eine Instanz der
ApplicationService
, dann 'injizieren' es mit einem mockrepo
- und/oderdto
Objekt. Dann können Sie testen, ob die korrekten Aufrufe vorgenommen wurden, auf die diese verspottet, mit derVerify
nennen. Du bist fast da!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es wenig oder keinen Vorteil der Verwendung von dependency injection in unit-Tests. Dependency injection hilft Ihnen bei der Erstellung lose gekoppelter Komponenten und lose gekoppelte Komponenten sind leichter zu testen, das Wars.
Also, wenn Sie testen möchten-service, nur Attrappen, es Abhängigkeiten und übergeben Sie an, dass der service wie gewohnt (keine Notwendigkeit der Beteiligung von IOC-container hier, ich kann sich kaum vorstellen, dass Sie, müssen Sie einige features von IOC-Containern - wie kontextuelle Bindung, abfangen etc. - inside unit-test).
Wenn Sie möchten, dass Ihre
ApplicationService
um einfach zu testen, es sollte Aussehen wie:Hier die Abhängigkeit übergeben wird durch den Konstruktor. In Ihrer Anwendung code, den Sie zusammen mit einem IOC-container zu machen constructor injection (IOC-container sind verantwortlich für das erstellen von Instanzen von
IEntityFrameworkRepo
).Aber im unit-test, Sie können nur passieren Instanz einer Implementierung von
IEntityFrameworkRepo
auf Ihrem eigenen.ApplicationDto
Solange
ApplicationDto
Sie einige Objekt, das durch die von hand angelegt, ich kann auch direkt im unit-testen (erstellen von Instanzen von hand). Ansonsten werde ich haben, um wickeln Sie es nach Schnittstelle wieIApplicationDto
, um der Lage sein, zu verhöhnen, als es mit Moq.Hier ist, wie könnte unit-test wie folgt Aussehen:
In unit-test-ich werde verspottet Implementierung
IApplicationRepo
, weil ich nicht konfigurieren möchten, z.B. Datenbank-verbindungen, web services etc. und meine primäre Absicht ist, zu testen, dieApplicationService
nicht die zugrunde liegenden repository. Ein weiterer Vorteil ist, dass der test lauffähig ohne spezielle Konfiguration für verschiedene Maschinen. Zum mockup einige db-repository, die ich nutzen kann z.B.List
.Hinweis:
Gab es realeased ein ninject.mockingkernel Erweiterung. Der Ansatz, beschrieben in Beispiel auf wiki können Sie Ihre unit-test-code etwas aufgeräumter, aber der Ansatz beschrieben, es ist definitiv nicht depencdency Einspritzung (es ist der service-locator).
applicationDto
fühle ich mich noch, was ist die Verwendung von unit-Tests, wenn der Ausgang vorhersehbar ist die Verwendung eines mocking-Frameworks. Die Staaten zurückgeben, wenn das passiert. Mocking framework wird es richtig machen, hhmmm ahhhh völlig verloren in unit-Tests jetztApplicationDto
es sei denn, es ist etwas schwer zu erstellen per hand oder schwer zu konfigurieren Objekt mit viel Abhängigkeiten. Schauen Sie auf meine aktualisierte Beispiel in der Antwort, hoffe es hilft dir besser zu verstehen. Beachten Sie, dass Sie arttypisch mocks verwenden anstelle von realen Implementierungen der Objekte, die schwer zu verwalten, zu erstellen oder zu konfigurieren, innerhalb der unit-test.