如何使用Visual Studio 2008对C#Web服务进行单元测试

时间:2008-12-16 17:08:37

标签: c# web-services unit-testing

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

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

然而,它将在不执行测试的情况下完成。我尝试将调用添加到WebServiceHelper.TryUrlRedirection(...),但调用不喜欢目标,因为它继承自WebService,而不是WebClientProtocol

6 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:8)

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

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

如果您正在使用Web方法,请将生成的调用方包装在类包装器中,并为类包装器实现一个接口。然后,只要您需要调用Web服务,请使用该接口来调用该方法。您希望使用该接口,以便在测试期间使类包装器可交换(使用Rhino Mocks,Moq或TypeMock)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

答案 4 :(得分: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单元测试向导。

答案 5 :(得分:0)

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

但是,我喜欢编写包装类来提供针对服务的有用功能。例如,Bing Maps具有许多非常强大的功能。我对这些进行测试只是为了确保它们给我预期的值。虽然不是很广泛,但它们的重点是,如果Web服务因任何原因而死(身份验证密钥到期等),那么我可以通过测试服务器通知它。