【问题标题】:How to unit test C# Web Service with Visual Studio 2008如何使用 Visual Studio 2008 对 C# Web 服务进行单元测试
【发布时间】:2026-01-02 06:00:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用什么项目类型进行 Web 服务?这是 WCF asmx 吗?是网站还是网络应用程序
  • 这不是 WCF。它只是一个普通的 asmx web 服务。

标签: c# web-services unit-testing


【解决方案1】:

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

【讨论】:

  • 很好的答案。如果可以的话,我会给你更多。不幸的是,使 .asmx webservices 难以测试的最大问题是整个方法都用 [WebService] 装饰(将方法指定为 webservice 方法)创建接口和假类不起作用。推导出“假货”是行不通的。多伦的建议似乎是最简单的方法。有趣的是,当我将功能提取到可测试的类中时,我经常将该类称为服务。所以我刚刚创建的实际上是一个 Web 服务的服务。您可以想象类的名称是什么样的:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的,我做到了。我只是好奇你应该如何以“微软的方式”来做。又名 MSDN 文档指定的方式以及单元测试如何自动生成。
    • 很糟糕,我错过了那部分。我总是让我的网络服务实现尽可能小,测试我的对象反而更容易;-)
    【解决方案4】:

    我也遇到了这个问题,所以我使用了这个解决方法: http://techkn0w.wordpress.com/2009/07/01/unit-testing-an-asmx-web-service-in-visual-studio-2008/

    【讨论】:

      【解决方案5】:

      在我的网络方法单元测试之上,我有以下内容:

      // 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 单元测试向导。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】: