7

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

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

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

我想我可以添加一个链接到app.config,除了我使用SlowCheetah来处理app.config转换,所以我app.config是在编译时生成的。

我能做些什么来让它工作,还是我只需要放弃我app.config并处理代码中的配置?

4

2 回答 2

5

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

于 2012-08-20T16:59:57.327 回答
1

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

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

记住这个模式:

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

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

如果那个正在运行的服务有一个错误导致单元测试失败,或者更糟的是不准确地通过,会发生什么?将依赖项包装在抽象层中进行测试需要做更多的工作,但完全值得。

于 2012-08-20T17:16:07.970 回答