我有一个与WCF服务交互的类库,并使用app.config
文件进行配置。我想对这门课进行单元测试,但是当我进行单元测试时,我得到了:
无法在服务模型客户端配置部分中找到引用合同“FooService”的默认端点元素。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素
根据this answer,我需要app.config
文件驻留在我的单元测试项目中,这确实解决了这个问题。但我真的不想每次更改时都要将app.config
文件复制到单元测试中。
我想我可以添加app.config
的链接,除了我正在使用SlowCheetah来处理app.config
转换,因此我的app.config
是在编译时生成的
我能做些什么才能让它发挥作用,或者我只是放弃我的app.config
并处理代码中的配置?
答案 0 :(得分:5)
您可以在测试中模拟WCF服务。在单元测试类时,可以注入不使用WCF服务的服务版本。这样,当测试运行时,他们不需要担心任何配置文件。这也将导致更好的测试。大概你想测试你的代码,而不是WCF服务本身。最好在测试中模拟它的行为,这样你就可以只测试 你的代码了。
答案 1 :(得分:1)
创建一个客户端包装器,我之前做了同样的事情做了一个ChannelLocator< T>实现了IChannelLocator< T>在它下面主要包含了一个渠道工厂的行为。
但是要非常小心这个抽象不会泄漏下面的连接,ChannelFactory的渠道管理机制很复杂,应该仔细研究,以避免泄漏客户端或服务器渠道,这可能使他们中的任何一个没有响应。
记住这种模式:
try
{
yourChannel.Close();
}
catch
{
yourChannel.Abort();
}
然后在你的单元测试中,你只是Mock< IChannelLocator< T>>并且您可以在代码中创建更多场景,例如,您可以测试代码在客户端发出请求时如何响应并获得超时异常等。此外,这将使您的测试运行得非常快,并且在任何人的计算机上都没有配置,因为您的测试不再依赖于正在运行的服务。
如果主动运行的服务有导致单元测试失败的错误,或更糟糕的传递不正确,会发生什么?将依赖项包装在抽象层中进行测试需要更多的工作,但完全值得一试。