我正在尝试对 Moq 中模拟对象的方法设置期望。同时,使用 Ninject,每当调用者需要相应的接口(interface)时,我都会尝试让内核返回我设置的模拟。为了更清楚起见,这里有一些伪代码
Class Car {
Void buildChassis() {
Engine = ObjectBuilder.get<Iengine>()
Engine.performCheckup()
}
}
在测试 buildChassis 时,我想插入一个模拟引擎。
Mock<Iengine>().setup().etc.etc.etc
但是,Moq 与 Ninject 配合得不太好:我无法实现这一点。我想知道是否有任何强大的软件包可以集成 DI 和模拟。我无法让 ninject.moq 包工作,而且它似乎也不成熟。
最佳答案
我使用并喜欢 Moq,但使用与 Ninject 不同的 IoC 容器。我从来没有觉得需要集成模拟/隔离和 IoC 容器框架。我使用构造函数注入(inject),然后简单地将模拟对象传递给单元测试中的类。只有生产代码使用容器。
恕我直言,这里真正的问题是 Car 了解 ObjectBuilder。与其使用容器作为服务定位器,为什么不进行构造函数注入(inject)呢?这样,只有一个顶级类需要了解有关 IoC 容器的任何信息。
class Car
{
public Car(IEngine engine)
{
// May want a null check here
Engine = engine;
}
public IEngine Engine { get; private set; }
}
单独测试汽车很容易;创建一个模拟 IEngine 并将其传递给构造函数。
如果稍后需要创建引擎,可以传入工厂接口(interface)。
如果您决定更改为不同的 IoC 框架,则只需更改一两个顶级类。
关于.net - .net 的依赖注入(inject)和模拟框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151706/