2008-12-16 8 views
11

Wie soll ein Webdienst in C# mit Visual Studio 2008 getestet werden? Wenn ich einen Komponententest erzeuge, fügt er anstelle einer Webreferenz einen tatsächlichen Verweis auf die Webservice-Klasse hinzu. Es legt die Attribute angegeben in:Testen des C# -Webdienstes mit Visual Studio 2008

http://msdn.microsoft.com/en-us/library/ms243399(VS.80).aspx#TestingWebServiceLocally

Doch es ohne die Ausführung der Test abgeschlossen wird. Ich habe versucht, den Anruf zu WebServiceHelper.TryUrlRedirection(...) hinzuzufügen, aber der Anruf mag das Ziel nicht, da es von WebService, nicht WebClientProtocol erbt.

+1

Welchen Projekttyp verwenden Sie für den Webservice? Ist das ein WCF asmx? Ist es Website oder Web-Anwendung – JoshBerke

+0

Es ist nicht WCF. Es ist nur ein normaler asmx Webservice. –

Antwort

24

Was ich normalerweise tue, ist nicht direkt gegen den Web-Service zu testen, sondern zu versuchen, so wenig Code wie möglich in den Dienst zu stellen und eine andere Klasse aufzurufen, die die ganze Arbeit erledigt. Dann schreibe ich Komponententests für diese andere Klasse. Es stellt sich heraus, dass die Klasse manchmal außerhalb des Web-Service-Kontexts nützlich sein kann, also auf diese Weise - Sie gewinnen doppelt.

+0

Große Antwort. Ich würde dir mehr geben, wenn ich könnte. Es ist bedauerlich, dass die größte Sache, die .asmx-Webservices schwer zu testen ist, die Tatsache ist, dass die gesamte Methode mit [WebService] dekoriert ist (was die Methode als Webservice-Methode bezeichnet). Eine Schnittstelle zu erstellen und eine falsche Klasse funktioniert nicht. Das Ableiten eines "Fake" funktioniert nicht. Dorons Vorschlag scheint der einfachste Weg zu sein. Lustige Sache ist, wenn ich Funktionalität in eine testbare Klasse extrahiere, die ich diese Klasse häufig einen Service nenne. Also ist das, was ich gerade erstellt habe, tatsächlich ein Service für einen Webservice. Sie können sehen, wie der Name der Klasse aussah :) – SideFX

1

Sie können Ihrem Komponententestprojekt eine Servicereferenz hinzufügen oder Ihren Client-Stub generieren und die Klasse in Ihr Komponententestprojekt einfügen.

+0

Ja, das habe ich getan.Ich war nur neugierig, wie Sie es auf "Microsoft-Art" machen sollten. AKA wie die MSDN-Dokumente angeben und wie der Komponententest automatisch generiert wird. –

+0

mein schlechter Ich habe diesen Teil verpasst. Ich halte meine Web-Service-Implementierung immer so klein wie möglich und teste meine Objekte stattdessen viel einfacher ;-) – JoshBerke

8

Wenn Sie einen Webdienst schreiben, versuchen Sie, die gesamte Logik in eine andere (testbare) Ebene zu stellen. Jede Webmethode sollte so wenig Code wie möglich enthalten. Dann haben Sie wenig Grund, die Webmethode direkt zu testen, da Sie die darunter liegenden Schichten testen können.

[WebMethod] 
public void DoSomething() 
{ 
    hander.DoSomething(); 
} 

Wenn Sie eine Web-Methode verbrauchen, wickeln Sie das erzeugte Anrufer in einer Klasse-Wrapper und eine Schnittstelle für die Wrapper-Klasse implementieren. Wenn Sie dann den Web-Service aufrufen müssen, rufen Sie die Methode über die Schnittstelle auf. Sie möchten die Schnittstelle verwenden, damit der Klassenwrapper während des Tests (mit Rhino Mocks, Moq oder TypeMock) ausgetauscht werden kann.

0

Vor meinen Web-Methode Unit-Tests, ich habe folgenden:

// TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example, 
// http://.../Default.aspx). This is necessary for the unit test to be executed on the web server, 
// whether you are testing a page, web service, or a WCF service. 
[HostType("ASP.NET")] 
[UrlToTest("http://localhost/MyWebService")] 

Neben dem üblichen:

[TestMethod()] 
[DeploymentItem("MyWebService.dll")] 

Dieser Code entstand aus der Visual Studio 2008 Unit-Test-Assistenten.

0

Wissen, dass es zwei Arten von Web-Service sind. Diejenigen, die Sie selbst schreiben und testen wollen, und diejenigen, die Sie konsumieren. Für die ersteren gelten die obigen Regeln. Ich würde jedoch sagen, dass Entwickler manchmal Tests mit externen Webdiensten durchführen. Logik schreibt vor, dass ein Dienst eines Drittanbieters unzuverlässig ist und daher viel mehr Tests erfordert. In der objektorientierten Programmierung ist es am besten, die Trennung von Bedenken zu verstehen, über die Martin Fowler und die anderen uns erzählt haben. Dies bedeutet, dass wir keine externen Systeme testen sollten.

Allerdings schreibe ich Wrapper-Klassen, um nützliche Funktionalität gegen die Dienste zu bieten. Zum Beispiel hat Bing Maps eine Reihe von erstaunlich leistungsstarken Funktionen. Ich schreibe Tests gegen diese, nur um sicherzustellen, dass sie mir die erwarteten Werte geben. Obwohl nicht umfassend, der Sinn von ihnen ist, dass, wenn der Web-Service aus irgendeinem Grund stirbt (Authentifizierungsschlüssel abläuft, usw.), dann kann ich über den Testserver darüber informiert werden.