如何测试WCF服务的客户端

问题描述:

我有一个WCF服务,公开了1个方法GetNextObjectInList(int id)命中一个数据库。如何测试WCF服务的客户端

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服务对象,但我想测试消费者代码的各种东西,如时间/性能/错误处理,但我不知道如何构建我的测试,使服务不会击中数据库。

我的大多数测试(例如针对服务对象运行的测试)都会创建一个内存数据库,但我不知道如何让服务连接到服务,而无需在服务中使用特定于测试的代码。

+0

接口...爱他们,学习他们,他们会让你的生活变得轻松。总是写入一个接口。 – 2010-10-19 21:20:37

+0

@Aaron ...我正在写这个服务的接口。你是否建议我注入服务的接口并在测试环境中将其模拟出来? – 2010-10-19 21:31:15

+0

Yessum ...以便MyService显示为IService ...然后模拟出来的IService进行测试不会进行数据库调用。 – 2010-10-19 21:38:17

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

 <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)的内部,你可以提供一切必要的测试客户端行为无需担心您的单元测试会破坏您的产品代码

+0

+1:这看起来很有希望。你是否从实际服务中抽象出逻辑,以便它和测试服务调用相同的基础逻辑? – 2010-10-19 21:58:25

+1

只有当我真的必须。请记住,在这种情况下,我没有测试服务,我正在测试客户端。这意味着从单元测试的角度来看,情况是客户端发送数据到服务,服务应该以这种方式响应。在这种情况下,您不一定在服务中执行相同的处理,因为可能不需要测试客户端代码。 – 2010-10-19 22:14:12

+0

+1:我想我们在同一页面上。谢谢你的帮助史蒂夫。 – 2010-10-19 22:15:32