【问题标题】:How to test a client of a WCF service如何测试 WCF 服务的客户端
【发布时间】:2010-10-19 21:17:59
【问题描述】:

我有一个 WCF 服务,它公开了 1 个方法 GetNextObjectInList(int id),它访问了一个 DB。

WCF 服务或多或少像这样工作:

public class MyService : IDisposable
{
    public MyService() 
    { 
        this.IntializeDBConnection();
    }

    public int GetNextObjectInList(int id) 
    { 
        /* uses DB connection */ 
    }

    /* Dispose releases DB connection */
}

这使得客户端代码相对简单:

public void UseNextElementInList()
{
    IMyService svc = new MyServiceClient();
    int nextID = svc.GetNextObjectInList(this.ID);

    /* use object */
}

我已经编写了单元测试来测试 WCF 服务对象,但我想测试消费者代码的各种事情,例如计时/性能/错误处理,但我不知道如何构建我的测试,以便服务未命中数据库。

我的大多数测试(例如针对服务对象运行的测试)都创建了一个内存数据库,但我不知道如何在服务中没有特定于测试的代码的情况下让服务连接到该数据库。

【问题讨论】:

  • 界面...爱他们,学习他们,他们会让你的生活变得轻松。始终写入接口。
  • @Aaron... 我正在针对该服务的接口编写代码。是不是建议我注入服务的接口,在测试环境中模拟出来?
  • Yessum...这样 MyService 就会显示为 IService...,然后用于测试的模拟 IService 不会进行数据库调用。
  • @Aaron:不幸的是,这不是我想要测试的。我想测试客户端代码和实际服务协同工作的集成。
  • 我很困惑,因为解决方案似乎使用接口来允许构建测试服务,因此您可以调用接口...您是否担心服务的消耗?电线?客户对返回的数据做了什么?

标签: c# wcf unit-testing integration-testing


【解决方案1】:

我将为您的单元测试创​​建一个测试服务。通常我在这些情况下所做的是为测试项目创建一个与真实项目相同的配置,除了地址是本地主机,类型是我的测试服务类:

        <service name="MyNamespace.TestService" behaviorConfiguration="BehaviorConfig">
            <endpoint address="net.tcp://localhost/MySolution/TestService"
                                binding="netTcpBinding"
                                bindingConfiguration="BindingConfig"
                                contract="MyNamespace.IMyService"/>

如果您使用的是 VS 测试项目,您可以使用 ClassInitialize / ClassCleanup 属性来设置/拆除服务:

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext) {
        mHost = new ServiceHost(typeof(TestService));
        mHost.Open();
        return;
    }
    [ClassCleanup()]
    public static void MyClassCleanup() {
        if(mHost != null) {
            mHost.Close();
        }
        return;
    }

现在在 TestService 类(将实现 IMyService)中,您可以提供测试客户端所需的任何行为,而不必担心您的单元测试会破坏您的生产代码

【讨论】:

  • +1:这看起来很有希望。您是否从实际服务中抽象出逻辑,以便它和测试服务调用相同的底层逻辑?
  • 只有在我真的需要的时候。请记住,在这种情况下,我不是在测试服务,而是在测试客户端。这意味着从单元测试的角度来看,情况是客户端向服务发送数据并且服务应该以这种方式响应。在这种情况下,您不必在服务中执行相同的处理,因为可能不需要测试客户端代码。
  • +1:我认为我们在同一页上。感谢史蒂夫的帮助。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多