在没有OperationContext的情况下创建可测试的WCF服务

时间:2011-03-19 23:15:28

标签: c# wcf unit-testing

我已经实现了一个订阅/发布(为了我自己的享受)WCF服务,它运作得相当好。像我看到的所有博客和书籍一样,他们都使用OperationContext来获取客户回调地址。经过一些阅读,由于许多人说不使用OperationContext,我发现自己无法创建适当的单元测试。然而,我还没有找到替代方案。我想订阅方法可以接受一个参数来提供它自己的地址吗?我可以从集成测试站的角度看代码是可测试的,但不能用于单元测试,因为OperationContext总是为空。

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

稍微偏僻一点,但在显示代码示例时,哪里有一个好的WCF资源并考虑了测试?有大量的博客在没有提供样本测试用例的情况下重复相同的代码。

谢谢。

1 个答案:

答案 0 :(得分:8)

Microsoft开发人员非常喜欢sealedstatic个关键字(以及internal),他们讨厌virtual。由于标准测试方法和framworks通常不起作用。你有两个选择:

  1. 在自定义类中包含对OperationContext的访问权限,并将该类的实例注入您的服务。这将涉及额外的工作,因为您需要在服务之外的某处进行注射。例如,构造函数注入需要自定义IInstanceProvider
  2. 使用更强大的测试框架。检查能够拦截呼叫的Moles framework并重定向它们。这样可以“模拟”密封类和静态方法/属性。
  3. 另一种方法是简单地重构代码。将所有业务逻辑从您的服务中移除到单独的可测试业务类中,并让服务仅参与集成测试。服务更像是基础设施而不是一切都需要单元测试。集成/端到端/行为测试也是测试和有效的方法。