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

Dav*_* MZ 6 nunit unit-testing ninject mocking

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

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

2)当使用模拟对象时,在测试内部将其绑定

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

我怎样才能做到这一点,我正在使用c#和nunit.如果我的方法有误,我想听听正确的方法.

Sam*_*uel 35

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

这是我的解决方案:

Kernel.Rebind<TypeToBind>().ToConstant(Mock.Object);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我认为我自己所有的测试都是这样做的.事实上,Java中的AtUnit被发明为纯粹使用DI框架进行单元测试;). (4认同)

Rem*_*oor 2

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

  • 如果您正在测试的是 DI 绑定的有效性,并且您需要覆盖除非在应用程序环境中否则会失败的绑定(例如,绑定到将查找配置文件的配置服务),该怎么办? (3认同)
  • 我认为对于集成测试,您应该真正使用原始的 IoC 容器。对于班级级别的“原子单元测试”,自动模拟是最佳选择,恕我直言。 (2认同)