代码之家  ›  专栏  ›  技术社区  ›  mxmissile

实例化一个类进行测试

  •  0
  • mxmissile  · 技术社区  · 16 年前

    我需要测试一个属于服务类的方法。这个服务类在构造函数中有几个依赖项,一些被这个方法使用,一些没有。如果我们不应该在单元测试中使用DI容器,那么实例化服务类的最佳方法是什么?

    var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2(), etc.);
    

    这很难阅读,而且似乎有很多代码只是为了测试一种方法。当某些依赖项有自己的依赖项时,事情就会变得一团糟。

    3 回复  |  直到 16 年前
        1
  •  3
  •   tvanfosson    16 年前

    您应该真正考虑使用模拟框架将测试与实际的依赖对象隔离开来。我假设您使用C#(从 var 关键字),所以我将给出RhinoMock的一个示例。

    var respository1 = MockRepository.GenerateMock<Repository1>();
    repository1.Expect( r => r.SomeMethod() ).Return( someValue );
    
    var repository2 = MockRepository.GenerateMock<Repository2>();
    repository2.Expect( r => r.Method2() ).Return( someValue );
    
     ...
    
    var service = new Service( repository1, repository2, ... );
    
    repository1.VerifyAllExpectations();
    repository2.VerifyAllExpectations();
    

    使用此机制,您可以控制模拟对象如何响应测试中的类,并将测试代码与相关依赖项隔离开来。您还可以通过验证您设置的期望值是否已满足(称为)来测试您的被测类是否与它所依赖的类正确交互。

    对于构造函数中的参数数量,考虑提供一个默认的构造函数,它不需要参数,并且具有依赖项的公共设置。然后可以使用C#3.0中的便利机制来定义它们。

    var service = new Service {
        Repository1 = repository1,
        Repository2 = repository2,
        ...
    };
    
        2
  •  2
  •   Community CDub    4 年前

    http://www.myjavatools.com/cuecards/refactoring.html

    如果你想要的不仅仅是简单的构造

        3
  •  2
  •   Andrew Hare    16 年前

    有时(特别是在测试代码时),对代码进行一点重新格式化就可以做到这一点。虽然

    var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2());
    

    很难读懂,这是:

    var service = new ServiceClass(
        new Repository1(), 
        new Repository2(), 
        new ServiceClass2()
    );
    

    看起来好多了(至少对我来说)。