如何对我的 WCF 客户端类进行单元测试?
Posted
技术标签:
【中文标题】如何对我的 WCF 客户端类进行单元测试?【英文标题】:How can I unit test my WCF client class? 【发布时间】:2012-08-16 00:42:06 【问题描述】:我有一个与 WCF 服务交互的类库,并使用 app.config
文件进行配置。我想对这个类进行单元测试,但是当我运行单元测试时,我得到:
在服务模型客户端配置部分中找不到引用合同“FooService”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素
根据this answer,我需要app.config
文件驻留在我的单元测试项目中,这确实解决了问题。但我真的不想每次更改时都将我的app.config
文件复制到单元测试中。
我想我可以添加一个指向app.config
的链接,除了我使用SlowCheetah 来处理app.config
转换,所以我的app.config
是在编译时生成的。
我可以做些什么来让它工作,还是我只需要放弃我的app.config
并在代码中处理配置?
【问题讨论】:
单元测试不应该关心 app.config,因为每个类都应该独立于解决方案的其余部分进行测试。您是否已将项目参考导入到测试解决方案中? 确实需要将 web.config您可以在测试中模拟 WCF 服务。在对类进行单元测试时,可以注入不使用 WCF 服务的服务版本。这样,当测试运行时,他们不需要担心任何配置文件。这也将导致更好的测试。大概您想测试您的代码,而不是 WCF 服务本身。最好在您的测试中模拟它的行为,以便您可以仅测试您的代码。
【讨论】:
【参考方案2】:创建一个客户端包装器,我之前做了同样的事情,实现了 IChannelLocator
但是要非常小心,这个抽象不会泄漏下面的连接,ChannelFactory 的通道管理机制很复杂,应该仔细研究以避免泄漏客户端或服务器通道,这可能会使它们中的任何一个都没有响应。
记住这个模式:
try
yourChannel.Close();
catch
yourChannel.Abort();
然后在您的单元测试中,您只需 Mock
如果该正在运行的服务有一个错误导致单元测试失败,或者更糟的是不准确地通过,会发生什么?将依赖项包装在抽象层中进行测试需要做更多的工作,但完全值得。
【讨论】:
以上是关于如何对我的 WCF 客户端类进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章