Moq - Wie zum Hohn-web-service-Aufruf?
Den using
unten trifft eine externe Ressource, die ich nicht wollen, um tatsächlich getroffen. Ich will testen someResult
und der code, der es verwendet, aber jedes mal, wenn ich meine unit-test, dieser code noch versucht zu schlagen, die den echten web-service. Wie verwende ich die moq zu fake der echte Aufruf an die web service, aber nicht verspotten den rest des Codes innerhalb der mit?
public IMyInterface.SomeMethod()
{
//hits a web service
using ( mySoapClient client = new mySoapClient() )
{
var someResult = client.DoSomething();
...
...
}
}
[TestMethod()]
public void SomeMethodTest()
{
IMyInterface target = new MyInterface();
target.SomeMethod();
//Assert....
}
InformationsquelleAutor O.O | 2012-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie entkoppeln die web-service-Implementierung aus dem consumer -
Jetzt können Sie Gebrauch Moq zu verspotten, die
IServiceIWantToCall
um zu testen, die Logik derSomeMethod
InformationsquelleAutor cordialgerm
Hinzufügen Gurken " Antwort, ich habe eine
interface
für meine aktuelle service-Aufrufe namensIService
. Dann habe ich einenServiceMock
- Klasse, erbt die Schnittstelle Hinzugefügt und eine Globale variable mit dem Namen_service
. Im Konstruktor instanziieren ich dem mock-service und alle Methoden der Schnittstelle als solche:Du dann Spritzen Sie diese Klasse in Ihrem code anstelle der tatsächlichen web service. Es kehrt die Werte, die Sie es einrichten, um zurückzukehren. Sie können nun testen, ohne je auf Ihrem web-service.
InformationsquelleAutor Chris - Haddox Technologies
Müssen Sie zunächst in der Lage sein, um zu injizieren, die web-service. Erstellen eines neuen inneren SomeMethod() "fest Paare" die Methode, um die Produktion von code; kann nicht dynamisch sagen, dass es zu schaffen etwas anderes ist als eine mySoapClient.
Seit Sie erstellen möchten, und Sie zu zerstören, könnte ich vermuten, dass der code, den Sie testen möchten, akzeptieren
Func<IMySoapClient>
als einen parameter einer Methode oder als parameter des Konstruktors. Es würde in etwa so Aussehen:... oder:
Nun, wenn Sie erstellen Sie das Objekt, das Sie versuchen zu testen, definieren Sie eine Funktion, generiert die entsprechenden Moq mock von der Soap-service, die das Verhalten, das Sie erwarten würden von den echten Kunden, ohne die Nebenwirkungen (einschließlich der Lage zu sagen, dass der code Dispose()d der client), und übergeben Sie die Funktion in der Klasse oder Methode, die Sie testen wollen. In der Produktion, können Sie einfach definieren Sie die Funktion als
()=>new mySoapClient()
oder man könnte die Einrichtung ein IoC-framework und registrieren mySoapClient als IMySoapClient, dann auch registrieren MyClass; die meisten IoC-frameworks sind schlau genug, um zu sehen, den Delegaten als parameter ein und erzeugen Sie die Methode, die injiziert registriert Abhängigkeit.Func<T>
ist ein built-in-Typ, der hält einen Delegaten (einen "Zeiger" auf eine Methode) , nimmt keine Parameter und gibt ein Objekt des generischen Typs (in Ihrem Fall, Sie möchten, dass der soap-client). Lesen Sie, delegieren übergabe in C#; es ist ein sehr mächtiges feature der Sprache und framework.In Unit-Tests,bin ich lustig das response-Objekt für unit-Tests.In das response-Objekt ,will ich weisen Sie Werte zu einem, der in der Eigenschaft über den Spott.Wie kann ich erreichen, dass
Ich würde dies tun, durch die Einstellung der Eigenschaft Ihrer response-Objekt als Teil Ihrer definition von mock-Verhalten für die Funktion, die erzeugt das response-Objekt.
InformationsquelleAutor KeithS