如何对WCF客户端类进行单元测试?

时间:2012-08-20 16:56:09

标签: c# .net visual-studio-2010 wcf .net-4.0

我有一个与WCF服务交互的类库,并使用app.config文件进行配置。我想对这门课进行单元测试,但是当我进行单元测试时,我得到了:

  

无法在服务模型客户端配置部分中找到引用合同“FooService”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素

根据this answer,我需要app.config文件驻留在我的单元测试项目中,这确实解决了这个问题。但我真的不想每次更改时都要将app.config文件复制到单元测试中。

我想我可以添加app.config的链接,除了我正在使用SlowCheetah来处理app.config转换,因此我的app.config是在编译时生成的

我能做些什么才能让它发挥作用,或者我只是放弃我的app.config并处理代码中的配置?

2 个答案:

答案 0 :(得分:5)

您可以在测试中模拟WCF服务。在单元测试类时,可以注入不使用WCF服务的服务版本。这样,当测试运行时,他们不需要担心任何配置文件。这也将导致更好的测试。大概你想测试你的代码,而不是WCF服务本身。最好在测试中模拟它的行为,这样你就可以只测试 你的代码了。

答案 1 :(得分:1)

创建一个客户端包装器,我之前做了同样的事情做了一个ChannelLocator< T>实现了IChannelLocator< T>在它下面主要包含了一个渠道工厂的行为。

但是要非常小心这个抽象不会泄漏下面的连接,ChannelFactory的渠道管理机制很复杂,应该仔细研究,以避免泄漏客户端或服务器渠道,这可能使他们中的任何一个没有响应。

记住这种模式:

try
{
  yourChannel.Close();
}
catch
{
  yourChannel.Abort();
}

然后在你的单元测试中,你只是Mock< IChannelLocator< T>>并且您可以在代码中创建更多场景,例如,您可以测试代码在客户端发出请求时如何响应并获得超时异常等。此外,这将使您的测试运行得非常快,并且在任何人的计算机上都没有配置,因为您的测试不再依赖于正在运行的服务。

如果主动运行的服务有导致单元测试失败的错误,或更糟糕的传递不正确,会发生什么?将依赖项包装在抽象层中进行测试需要更多的工作,但完全值得一试。