C# 如何对WCF客户机类进行单元测试?
我有一个与WCF服务交互的类库,并使用C# 如何对WCF客户机类进行单元测试?,c#,.net,visual-studio-2010,wcf,.net-4.0,C#,.net,Visual Studio 2010,Wcf,.net 4.0,我有一个与WCF服务交互的类库,并使用app.config文件进行配置。我想对这个类进行单元测试,但当我运行单元测试时,我得到: 在服务模型客户端配置部分中找不到引用约定“FooService”的默认终结点元素。这可能是因为找不到应用程序的配置文件,或者在客户端元素中找不到与此约定匹配的端点元素 根据,我需要app.config文件驻留在我的单元测试项目中,这确实解决了问题。但我真的不想每次修改时都把我的app.config文件复制到单元测试中 我想我可以添加一个到app.config的链接,除
app.config
文件进行配置。我想对这个类进行单元测试,但当我运行单元测试时,我得到:
在服务模型客户端配置部分中找不到引用约定“FooService”的默认终结点元素。这可能是因为找不到应用程序的配置文件,或者在客户端元素中找不到与此约定匹配的端点元素
根据,我需要app.config
文件驻留在我的单元测试项目中,这确实解决了问题。但我真的不想每次修改时都把我的app.config
文件复制到单元测试中
我想我可以添加一个到app.config
的链接,除了我用来处理app.config
转换之外,所以我的app.config
是在编译时生成的
我可以做些什么来让它工作,还是我必须放弃我的
app.config
,用代码处理配置?你可以在测试中模拟WCF服务。在对类进行单元测试时,可以注入不使用WCF服务的服务版本。这样,当测试运行时,他们不需要担心任何配置文件。这也将导致更好的测试。您可能想测试代码,而不是WCF服务本身。最好在测试中模拟它的行为,这样您就可以只测试代码了。创建一个客户端包装,我以前做过同样的事情,做了一个实现IChannelLocator的ChannelLocator,在它下面主要包装了通道工厂的行为
但是,要非常小心,这种抽象不会泄漏下面的连接,ChannelFactory的通道管理机制很复杂,应该仔细研究,以避免泄漏客户端或服务器通道,这可能会使它们中的任何一个失去响应
记住这个模式:
try
{
yourChannel.Close();
}
catch
{
yourChannel.Abort();
}
然后在单元测试中,您只需模拟,就可以在代码中创建更多的场景,例如,您可以测试当客户机发出请求并获取超时异常时,代码如何响应,等等。此外,这将使您的测试运行得非常快,并且在任何人的机器上运行,而无需配置,因为您的测试不再依赖于活动运行的服务
如果主动运行的服务有一个bug导致单元测试失败,或者更糟的是错误地通过,会发生什么?将依赖项包装在抽象层中进行测试需要做更多的工作,但这完全值得。单元测试不应该关心app.config,因为每个类都应该与解决方案的其余部分隔离测试。您是否已将项目引用导入测试解决方案?确实,您需要将web.config复制到测试项目的app.config。我所做的简化工作是为服务模型部分创建一个单独的.config文件,并从需要使用它的所有.config链接到它。这样我就可以在一个地方对整个解决方案进行更改。@四十二,这听起来是个不错的解决方案,不过对我来说,我认为我不能在那种情况下使用配置转换。您的客户端是否有构造函数重载,您可以在其中传递连接信息?