2011-03-19 41 views
10

我已经实现了一个相当不错的订阅/发布(用于我自己的享受)WCF服务。就像我见过的所有博客和书籍都使用OperationContext来获取客户回拨地址。经过一番阅读后,由于许多人说不使用OperationContext,我发现自己无法创建适当的单元测试。但我一直无法找到替代方案。我想这个订阅方法可以接受一个参数来提供它自己的地址吗?我可以从集成测试立场的角度看到代码是可测试的,但由于OperationContext将始终为空,所以不适用于单元测试。在没有OperationContext的情况下创建可测试的WCF服务

如何在不使用OperationContext的情况下订阅我的服务时获得客户端端点?

一点点的旁白,但是当显示代码示例时,哪里有一个很好的WCF资源,并且考虑到测试?有大量的博客在不提供示例测试用例的情况下重申相同的代码。

谢谢。

回答

7

微软开发者真的很喜欢sealedstatic关键字(以及internal),他们讨厌virtual。由于那种标准的测试方法和framworks通常不起作用。您有两种选择:

  1. 将对自定义类中OperationContext的访问包装起来,并将该类的实例注入到您的服务中。这将涉及额外的工作,因为您需要在服务之外的某个地方进行注射。例如构造函数注入将需要自定义IInstanceProvider
  2. 使用更强大的测试框架。检查Moles framework这是能够拦截呼叫并重定向它们。这使得“模拟”密封类和静态方法/属性成为可能。

另一种方法是简单地重构你的代码。将您的服务中的所有业务逻辑带入单独的可测试业务类,并让该服务仅参与集成测试。服务更像基础设施,并非所有事情都需要单元测试。集成/端到端/行为测试也是测试和有效的方法。

+0

不错的答案。并不是说我试图从鼹鼠框架中隐藏起来,但是我怎么会模仿'OperationContext'? – gcso 2011-03-23 22:51:44

+0

你通常不能模拟'OperationContext'(除非你包装它),但当使用Moles时,你可以将调用重定向到OperationContext到你自己的方法。至少这是我阅读一些文章后对他们工作的理解。 – 2011-03-23 22:53:27

+0

如果你看看http://code.google.com/p/netfx/,他们会为你准备好所有那些无法访问的WCF类。 – 2011-07-12 23:14:57

相关问题