如何对我的 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 复制到测试项目的 app.config 中。为了简化这一点,我为服务模型部分创建了一个单独的 .config 文件,并从需要使用它的所有 .config 链接到它。这样我就可以在一个地方对整个解决方案进行更改。 @Forty-Two,这听起来是个不错的解决方案,尽管对我来说,我认为我无法在这种情况下使用配置转换。 您的客户端是否有一个构造函数重载,您可以在其中传递连接信息? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

记住这个模式:

try

  yourChannel.Close();

catch

  yourChannel.Abort();

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

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

【讨论】:

以上是关于如何对我的 WCF 客户端类进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 WCF UriTemplates 进行单元测试?

WCF 单元测试

开玩笑的带有 expo sqlite 调用的单元测试类

NestJS如何在单元测试中创建新的猫鼬模型?

串行执行单元测试(而不是并行)

如何对 ServiceStack 进行单元测试?