【问题标题】:How to UnitTest WCF .SVC files如何对 WCF .SVC 文件进行单元测试
【发布时间】:2012-10-22 20:10:46
【问题描述】:

我计划对公开为 .svc 文件的 WCF 服务进行单元测试。对它们进行单元测试的最佳实践是什么。

据我所知,这是可用的选项:

创建一个单独的项目并为 .svc 文件创建代理类,并将它们添加到项目中并对这些代理类进行单元测试。 可以使用以下方式创建代理类:

  1. svcutil.exe
  2. Visual Studio 的“添加服务参考”选项。

还有其他最佳选择可用于使用 nunit 对我的 wcf .svc 文件进行单元测试吗?

【问题讨论】:

  • 你到底要测试什么?您是否要测试所有进一步的更改是否向后兼容,或者您​​只需要测试服务背后的逻辑?看起来您正在寻找集成测试而不是单元测试......
  • 我要测试所有的服务逻辑

标签: wcf unit-testing nunit


【解决方案1】:

如果您需要测试服务背后的逻辑,您可以编写简单的单元测试,如下所示:

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}
//Tests
[TestFixture]
public class MyService_Test
{
    [Test]
    public void GetData_should_return_entered_string()
    {
        Service1 service = new Service1();
        Assert.AreEqual("You entered: 1", service.GetData(1));
    }
}

如果您想测试整个集成,您可以编写以下集成测试。简而言之,您需要将服务作为自托管运行并使用 _proxy 来执行服务方法。当您需要测试自定义消息检查器、错误处理程序等扩展点时,此类测试很有用。

    private ITestService _proxy;
    private ServiceHost _host;

    [SetUp]
    public void Initialize()
    {
        const string baseAddress = "net.pipe://localhost/TestService";
        _host = new ServiceHost(typeof(TestService), new Uri(baseAddress));

        var factory = new ChannelFactory<ITestService>(new NetNamedPipeBinding(),
                                                       new EndpointAddress(baseAddress));
        _host.Open();
        _proxy = factory.CreateChannel();
    }

链接:

Integration Testing WCF Services

【讨论】:

    【解决方案2】:

    如果您只想测试服务的逻辑,只需实例化实现逻辑的类并调用其方法即可。这基本上绕过了 WCF,这对单元测试很有用,因为没有理由测试 Microsoft 的代码。另一方面,集成测试是另一回事。

    【讨论】:

      【解决方案3】:

      基本上,您不会对服务进行单元测试。您对他们的代码进行单元测试,就像该代码不在服务中一样。

      甚至不要创建服务类的实例。这对于单元测试来说太大了。您将在该类 对代码进行单元测试。请记住,单元测试旨在测试代码的最小可能单元,而不是整个服务。

      【讨论】:

      • 如何调用实例方法的代码而不实例化它所定义的类?
      • 在大多数情况下,您不会实例化顶级类。该类使用其他类来完成这项工作。这些就是您实例化的内容。
      • 所以你不对顶级类进行单元测试?如果它包含大部分逻辑怎么办?在许多 CRUD 服务中,不需要将逻辑委托给其他类,您只需在此处编写即可。
      • 如果您的代码都在顶级类中,那么您将其编写为不可测试的。坏主意。
      • 为什么在top-level的class里就无法测试?另外,怎么会有“不可测试”的东西?这不只是简单程度乘以您的测试工具的能力吗?
      猜你喜欢
      • 2011-05-31
      • 2010-09-07
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2012-01-08
      相关资源
      最近更新 更多