C # WebApi Unit Test- und Mocking-Controller

8

Ich arbeite an diesem WebAPI-Projekt und muss Unit-Tests dafür erstellen. Die Basis des Projekts wurde mit VS 2010 erstellt, und dann wurde ein WebApi-Modul hinzugefügt.

Die Funktionsweise des Controllers behindert das Testen / Mocking irgendwie. Ich benutze xUnit und Moq, aber es gibt absolut keine Notwendigkeit, bei diesen beiden zu bleiben.

Die Anwendung verwendet bestimmte Objekte, um mit Datenbankzugriff umzugehen, also habe ich die controllerObject und sein Konstruktor benötigen das DataAccessObject

Ich habe Probleme mit dem Controller / Datenzugriffspaar. Der erste Test, den ich ausführen möchte, ist ein GetAllFromDataBase, aber ich habe wirklich keine Ahnung, wie es geht.

BEARBEITEN:

Ich habe getan, was Cuong Le mir gesagt hat und das Ganze bewegt sich jetzt, ich schätze es wirklich sehr. Aber ich stapfte auf ein anderes Problem. Um auf die API zuzugreifen, gibt es ein Benutzername / Passwort-Paar und mein Controller verwendet Thread.CurrentPrincipal.Identity.Name; Im Moment müsste ich diesen Wert einstellen, damit er voll funktioniert, denke ich.

Auch die valueServiceMock.Setup (service = & gt; service.GetValues ​​())             .Returns (neu [] {"Wert1", "Wert2"});

scheint nicht zu funktionieren. Der Code versucht, nach der Datenbank zu greifen, und erhält nichts, da er keinen gültigen Benutzernamen für

abrufen kann     
oSR 03.08.2012, 19:47
quelle

1 Antwort

18

Um Ihre App testbar zu machen, müssen Sie die Testbarkeit berücksichtigen. Technisch gesehen sollte Ihre App so locker wie möglich zwischen Schichten, zwischen Komponenten und sogar zwischen Klassen sein, um die Testbarkeit zu testen.

>

Eine Menge Tipps für die Testbarkeit: Vermeiden Sie versiegelte, statische Klassen ... Aber die bekannteste Sache, auf die Sie achten sollten, ist dependency injection pattern , anstatt Objekt innerhalb von Konstruktoren oder Methoden anderer Objekte zu erstellen, sollte dieses Objekt injiziert werden. Auf diese Weise machen wir lose Abhängigkeit zwischen Klasse und einfach für uns Fake durch Spott Framework. Esp, für die Objekte, die von externen Ressourcen abhängig sind: Netzwerk, Datei oder Datenbank.

So injizieren Sie Objekte mithilfe von Dependency-Injection: Deshalb ist IocContainer das richtige Werkzeug dafür, es injiziert Objekte automatisch für Sie. IoC Container, den ich bevorzuge, ist: Autofac und NInject .

Beispiel hier, um ValueService in ValuesController zu injizieren:

%Vor%

Und unten ist der einfache Code zum Komponententest mit Moq:

%Vor%     
Cuong Le 04.08.2012, 06:37
quelle