识别服务外观的“有效”单元测试

时间:2011-11-11 16:39:10

标签: unit-testing testing integration-testing

鉴于以下(基本)服务门面类,我想要一些关于单元测试应该和值得写的建议和指导。我使用MEF进行依赖注入,使用AutoMapper将数据协定的对象到对象映射到域对象,反之亦然。

public sealed class MyServiceFacade
{
    [ImportingConstructor()]
    public MyServiceFacade(IDependency dependency,
                           IMappingEngine mappingEngine)
    {
        if (dependency == null)
            throw new ArgumentNullException("dependency");

        if (mappingEngine == null)
            throw new ArgumentNullException("mappingEngine");

        Dependency = dependency;
        MappingEngine = mappingEngine;
    }

    public IDependency Dependency { get; private set; }
    public IMappingEngine MappingEngine { get; private set; }

    public ResponseContract TheMethod(RequestContract requestContract)
    {
        // Verify parameters
        if (requestContract == null)
            throw new ArgumentNullException(requestContract);

        // Translate parameter values
        var request = MappingEngine.DynamicMap<Request>(requestContract);

        // Delegate to the domain layer
        var response = Dependency.DoSomethingWith(request);

        // Translate the response
        var responseContract = MappingEngine.DynamicMap<ResponseContract>(response);

        // Return the response
        return responseContract;
    }
}

我希望看到良好的代码覆盖率,但不想编写无用/有效的测试。

(关于有效整合测试的建议也会有所帮助。)

你的想法?

更新

基于有限的回答,我认为我继续通过描述我认为是“最坏情况”的情景来引导对话(我试图最初避免的事情)。

我的团队中的一位开发人员是“白盒子”单元测试的强力倡导者,尽可能多地进行代码覆盖。由于他的方法,我们有以下测试:

  1. 构造对象时,如果'dependency'属性为null,则抛出ArgumentNullException。
  2. 构造对象时,如果'mappingEngine'属性为null,则抛出ArgumentNullException。
  3. 构造对象时,如果两个参数都不为null,则不会抛出ArgumentNullException。
  4. 构造对象后,Dependency属性将在'dependency'参数中传递的对象返回给构造函数。
  5. 构造对象后,MappingEngine属性将“mappingEngine”参数中传递的对象返回给构造函数。
  6. 调用TheMethod时,如果'requestContract'属性为null,则抛出ArgumentNullException。
  7. 调用TheMethod时,如果'requestContract'属性不为null,则不会抛出ArgumentNullException。
  8. 当调用TheMethod时,模拟的IMappingEngine的DynamicMap()方法仅在RequestContract传递给TheMethod时被调用一次。
  9. 调用TheMethod时,模拟的IDependency的DoSomethingWith()方法仅使用模拟的IMappingEngine返回的Request对象调用一次。
  10. 调用TheMethod时,模拟的IMappingEngine的DynamicMap()方法仅在使用模拟的IDependency返回的Response对象时调用一次。
  11. 调用TheMethod时,将返回从模拟的IMappingEngine返回的ResponseContract对象。
  12. 正如您所看到的,这会导致大量测试真正测试实现,并且不会反映更高级别的要求(表中的另一种方法)。

    这是你接近测试的方式,还是你会走另一条路?

1 个答案:

答案 0 :(得分:0)

  

我想要一些关于单元测试应该和值得编写的建议和指导

我使用equivalence partitioning建议一组提供良好覆盖的基本测试。