当前位置:  开发笔记 > 后端 > 正文

WCF单元测试

如何解决《WCF单元测试》经验,为你挑选了4个好方法。

如何对WCF服务进行单元测试?有可用的第三方工具吗?



1> Jason Stangr..:

正如aku所说,如果您正在测试服务方法(即代码行为),那么您可以直接对其进行单元测试并绕过WCF基础架构.当然,如果您的代码依赖于WCF上下文类(如OperationContext),那么我建议引入包装器,就像ASP.NET MVC为HttpContext做的那样.

对于测试连接,它将取决于您配置的端点类型.在某些情况下,您可以在单元测试中自行托管您的WCF服务(就像使用WCF Windows服务一样)并对其进行测试.

但是,如果要测试特定于这些托管环境的WCF行为(即SSL,身份验证方法),则可能需要启动ASP.NET Development Web Server甚至IIS.这变得棘手,可以开始对每个人的开发机器和构建服务器的配置提出要求,但是可行.


您是否知道如何使用MVC3作为单元测试的包装器的教程?

2> Jeno Laszlo..:

我认为最好的方法是分别测试所有问题; 测试连接,客户端lib(代理)和服务方法调用.模拟和依赖注入是一种独立测试连接和服务行为的好方法,但我怀疑它可以绕过依赖于中间件的端点测试.

您可以在测试中创建服务主机(自托管)并加载服务.设置好终点后,您可以使用客户端代理连接到终点.这应该适用于简单的HTTP和WSHTTP.在单元测试中,您需要创建服务的服务引用.然后,您可以创建主机并将客户端与测试主机连接在一起.我会尽量避免使用"WCF服务主机"即WcfSvcHost进行任何测试.(我之所以提到这一点,只是因为有些人提到了Visual Studio utils;只有当你只从IDE运行测试时才能使用它.)

如果需要检查使用特殊中间件的异乎寻常的身份验证方案或端点,则需要使用中间件创建测试.对于简单的健全性检查,使用自托管的等等就足够了.如果您使用构建服务器,则依赖于中间件的测试可能会导致测试部署问题.

依赖于中间件的端点我指的是使用例如MOM(MSMQ,RabbitMQ等)或真正奇特的协议等的端点.也许使用自托管模拟测试客户端代理并分别测试异国情况的端点是可行的方法.

如果你想使用依赖注入,有一些非常复杂的框架提供"服务抽象"功能,允许你注入模拟服务等.我使用Spring.NET和WCF几次.Castle Windsor酒店还提供WCF设施.

自托管测试示例:

    ServiceHost serviceHost = null;

    try
    {
        var baseAddress = new Uri("http://localhost:8000/TestService");
        serviceHost = new ServiceHost(typeof (ServiceClass), baseAddress);
        Binding binding = new WSHttpBinding();
        var address = new EndpointAddress("http://localhost:8000/TestService/MyService");
        var endpoint = serviceHost
            .AddServiceEndpoint(typeof (IServiceContract), binding, address.Uri);

        var smb = new ServiceMetadataBehavior {HttpGetEnabled = true};
        serviceHost.Description.Behaviors.Add(smb);

        using (var client = new ProxyClient(endpoint.Name, endpoint.Address))
        {
            endpoint.Name = client.Endpoint.Name;

            serviceHost.Open();

            // ... magic happens 
        }

        serviceHost.Close();
    }
    catch (Exception ex)
    {
        // ... tests
    }
    finally
    {
        if (serviceHost != null)
        {
            ((IDisposable) serviceHost).Dispose();
        }
    }

我想指出功能测试工具与单元测试工具不同.单元测试应该是将测试分解为一系列独立测试,而功能测试主要是关于端到端测试工作流.


ProxyClient属于哪个命名空间/引用?

3> aku..:

你究竟想测试什么?连接或服务方法?

关于WCF的一个很酷的事情是你可以定义接口(错误,合同)并将它们作为常规代码进行测试.然后,您可以假设它们将通过WCF支持的任何连接类型工作.

可以通过直接在UT或开发Web服务器上托管您的服务来测试连接性.

至于工具,你有大量的单元测试框架:NUnit,Visual Studio中的内置测试,xUnit等等.

您可以下载" Visual Studio 2008和.NET Framework 3.5培训工具包 "和" .NET Framework 3.5增强培训工具包 ",如果我没记错的话,有WCF单元测试的样本



4> cruizer..:

如果真的想测试WCF服务,最好采用实际运行客户端 - 服务器连接部分的集成测试.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有