如何测试WCF服务的客户端

时间:2010-10-19 21:17:59

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

我有一个WCF服务,它公开了一个命中数据库的方法GetNextObjectInList(int id)

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服务对象,但是我想测试消费者代码的各种事情,比如时序/性能/错误处理,但我不知道如何构建我的测试,以便服务没有打到数据库。

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

1 个答案:

答案 0 :(得分:2)

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

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

如果您使用的是VS Test Project,则可以使用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)内部,您可以提供测试客户端所需的任何行为,而不必担心您的单元测试会破坏您的生产代码