2009-02-11 92 views
0

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

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

这很难读,似乎很多代码只是为了测试一种方法。当一些依赖关系具有自己的依赖关系时,事情会变得非常混乱。

+0

@tvanfosson:我喜欢我的版本的标题更好,其实;-) – mghie 2009-02-11 21:00:01

+0

我要修复它,但我敢肯定,我尝试它的那一刻相同的竞争条件将instaniate本身扰乱了标题再次。 – 2009-02-11 21:01:42

回答

2

你真的应该看看使用模拟框架来隔离你的测试与实际的依赖对象。我假设你使用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

有时候(尤其是如果它是测试代码)有点代码格式化的可以做的伎俩更。虽然

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

肯定是难以阅读,这一点:

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

似乎有点更好(至少对我来说)。