我有一个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服务对象,但是我想测试消费者代码的各种事情,比如时序/性能/错误处理,但我不知道如何构建我的测试,以便服务没有打到数据库。
我的大部分测试(例如针对服务对象运行的测试)都会创建一个内存中的数据库,但我不知道如何在服务中没有特定于测试的代码的情况下连接服务。
答案 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)内部,您可以提供测试客户端所需的任何行为,而不必担心您的单元测试会破坏您的生产代码