.net - .net 的依赖注入(inject)和模拟框架

标签 .net dependency-injection mocking moq ninject

我正在尝试对 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/

相关文章:

.net - 如果使用customErrors,则在Application_Error中重定向是否冗余?

c# - Unity、RegisterType<> 和 Singleton 对象

java - Spring boot应用程序,组件扫描缺少一些@Component

java - 如何在 Java 单元测试中模拟接口(interface)?

Python:模拟我正在测试的模块正在使用的模块

c# - 如何以编程方式选择 .NET CF TabControl 上的选项卡?

.net - 如何从我的 gridview 中删除 devexpress 右键单击​​菜单?

c# - 如果模型实现了 INotifyPropertyChanged,ViewModel 应该如何注册/注销 PropertyChanged 事件?

c# - 你如何根据用户交替 Ninject 绑定(bind)?

python - 如何模拟需要 Response 对象的 pydantic BaseModel?