Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对WCF客户机类进行单元测试?_C#_.net_Visual Studio 2010_Wcf_.net 4.0 - Fatal编程技术网

C# 如何对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的链接,除

我有一个与WCF服务交互的类库,并使用
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链接到它。这样我就可以在一个地方对整个解决方案进行更改。@四十二,这听起来是个不错的解决方案,不过对我来说,我认为我不能在那种情况下使用配置转换。您的客户端是否有构造函数重载,您可以在其中传递连接信息?