在测试方法中本地覆盖Ninject绑定以绑定模拟对象

时间:2011-09-22 12:58:57

标签: unit-testing mocking nunit ninject

我有以下问题,我想在我的单元测试中使用Ninject。 我对此的看法是这样的:

1)在模块中定义一个全局绑定模式,以绑定我在测试中使用的假对象

2)当使用模拟对象时,在测试

中本地绑定它

我没有找到一种在本地覆盖绑定配置的方法,我的想法是我在本地创建一个带有期望的模拟对象,我希望kernel.Get()方法返回一个具有所有绑定的对象,除了每个测试都会在测试中添加一个带有期望的本地模拟对象,这听起来对我来说是可读和可维护的,因为我每次测试只覆盖1个绑定,对象是模拟因此它们无法在模块内部配置为测试背景未知

我如何实现这一目标,我正在使用c#和nunit。 如果我的方法有误,我想听听正确的方法。

3 个答案:

答案 0 :(得分:35)

我有同样的问题,我知道这不是一个好方法,但在我身边,我做集成测试;不是单元测试。

以下是我的解决方案:

Kernel.Rebind<TypeToBind>().ToConstant(Mock.Object);

其中Kernel是您用于创建绑定的对象。 TypeToBind是您要注入依赖项的类型。 Mock.Object是您先前设置的对象。

同样,我知道这不是很酷,但在处理难以插入单元测试的遗留代码时,这可能是一个有良好安全网的救赎。

答案 1 :(得分:3)

您不应该使用IoC容器来创建要在单元测试中测试的对象。而是使用new手动创建它,并为每个构造函数参数传递一个mock / stub对象。

答案 2 :(得分:2)

我认为使用IoC框架进行测试是完美的方法。事实上,这就是为什么IoC首先存在然后框架来了。 Guice(google的java注入DI框架)实际上支持此功能,您可以使用生产绑定传递Module,然后传入一个TestModule,它可以覆盖与mockobjects的某些绑定,然后您可以测试。我们一直在这样做,并且在Java中已经很长时间了。我刚刚进入自己,试图让我的测试重新绑定东西,然后保留其余的绑定....

还有像AtUnit这样的框架,你应该使用DI框架来测试对象,而根本不使用new关键字。(不幸的是,我没有看到该框架的端口到C#land然而:()。

注意:这是理想的,因为当人们在生产模块中添加新的绑定然后在我的一个系统测试类中使用它时,它不会因为nullpointer异常而失败,因为接口没有绑定考试。人们不断添加,测试继续工作。在我看来,你应该只使用关键字&#34; new&#34;使用dtos和这些日子,所有的商业逻辑应该与DI连接,这样可以很容易地添加测试现在或以后很容易(尽管我喜欢先自己添加测试)。