2008-12-16 74 views
11

如何单元测试C#中的Web服务与Visual Studio 2008?当我生成一个单元测试时,它会添加一个对Web服务类的实际引用,而不是Web引用。它设置在指定的属性:如何使用Visual Studio 2008对C#Web服务进行单元测试

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

然而,这将完成不执行测试。我试图将该呼叫添加到WebServiceHelper.TryUrlRedirection(...),但该呼叫不喜欢该目标,因为它从WebService继承,而不是WebClientProtocol

+1

您使用哪种项目类型进行Web服务?这是一个WCF asmx?它是网站还是网络应用程序 – JoshBerke 2008-12-16 17:42:58

+0

它不是WCF。这只是一个正常的asmx web服务。 – 2008-12-16 18:07:15

回答

24

我通常所做的不是直接针对Web服务进行测试,而是尝试尽可能少地将代码放在服务中,并调用一个完成所有实际工作的不同类。然后我为其他班级编写单元测试。事实证明,类有时可以在Web服务环境之外有用,所以这样 - 你获得了两次。

1

您可以将服务引用添加到您的单元测试项目或生成客户端存根,并将该类放入单元测试项目中。

+0

是的,我做到了。我只是很好奇你应该怎么做“微软的方式”。也就是MSDN文档指定的方式以及单元测试如何自动生成。 – 2008-12-16 17:32:50

8

如果您正在编写Web服务,请尝试将所有逻辑放入另一个(可测试)图层。每个Web方法应该尽可能少些代码。那么你将没有理由直接测试Web方法,因为你可以测试底层。

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

如果你是消费的Web方法,包装在一个类包装产生的主叫方,并实现了类包装的接口。然后,无论何时您需要调用Web服务,都可以使用该界面调用该方法。您希望使用该接口以便在测试期间(使用Rhino Mocks,Moq或TypeMock)使类包装程序可交换。

0

我的网络方法的单元测试,我有以下几点:

// 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")] 

除了通常的:

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

此代码是约从使用Visual Studio 2008单元测试向导。

0

要知道,有两种类型的Web服务。那些你自己写的,想要测试的,以及你所消费的。对于前者,上述规则适用。但是,我会说有时我会看到开发人员针对外部Web服务进行测试。逻辑规定第三方服务不可靠,因此需要更多的测试。在面向对象编程中,最好理解Martin Fowler和其他人都告诉我们的关注点。这意味着我们不应该测试系统外部的系统。

但是,我喜欢编写包装类来提供对服务有用的功能。例如,Bing地图有许多非常强大的功能。我写这些测试只是为了确保他们给我预期的价值。虽然范围并不广泛,但重点在于,如果Web服务由于某种原因而死亡(身份验证密钥过期等),则可以通过测试服务器向我通知它。