自定义WCF扩展(如自定义行为和检查器)的单元测试

时间:2012-04-02 05:58:31

标签: .net wcf unit-testing mstest

对于某些需求,我编写了IServiceBehaviorIEndpointBehaviorIDispatchMessageInspector的实现,并且我的所有WCF服务都使用它们。

我需要对它们进行单元测试吗?如果是,我如何对这些自定义WCF扩展点进行单元测试?我正在使用MSTest。

1 个答案:

答案 0 :(得分:-1)

您应该有两组测试:

  1. 对这些接口的自定义实现进行单元测试
  2. 您的服务的集成测试(也将涵盖接口,但在完整的实际使用设置方案中)
  3. 单元测试实现应该像单元测试一样进行。这真的缩小到验证这些自定义实现的功能。简单,旧的单元测试。

    但是,请注意,成功单元测试这样的WCF位实现有两个主要障碍:

    • WCF上下文标题(或简单地单独放置上下文)在模拟方面很难处理,因为它们来自静态类(OperationContext.Current
    • 模拟一些方法参数可能是不可能的,因为它们是密封的(例如InstanceContext)或相当复杂的

    当然,使用适当的技术和工具可以克服所有这些:

    • 对于模拟不起作用的密封类,您只需创建实例(借助 AutoFixture 等工具)并手动设置对象/依赖关系图(可能很耗时,但在大多数情况下,你不会全部使用它们。)
    • 无论可以嘲笑/存根什么都可以这样做, FakeItEasy 让你只要存在任何类,只要它没有被密封(不必是一个接口)。处理未使用的方法参数非常棒。
    • 要处理OperationContext.Current(和类似的),你可能需要改变你的设计。确切地说,在某些方面使用当前上下文的所有类都需要实现公开它的protected virtual方法(或任何其他可能有用的部分,比如请求标题):

      protected virtual MessageHeaders GetContextHeaders()
      {
          return OperationContext.Current.RequestContext.RequestMessage.Headers;
      }
      

      然后你需要创建派生的,可测试的类,它将返回那些标题(或上下文或你打算使用的任何东西)的模拟/存根版本,并在单元中创建该类的实例测试

    完成单元测试后,integration应该是一个简短的步骤。只需将对象设置为在实际场景中使用的对象......并验证它们是否按预期工作。


    旁注:单元测试也可以通过更简单的方式完成,但是您需要付费工具(例如Typemock Isolator,让您模拟静态/密封类)和/或有点重/复(PEX/Moles)。

相关问题