gpt4 book ai didi

unit-testing - 使用 Moq 模拟对象,在进行单元测试时使用 Ninject

转载 作者:行者123 更新时间:2023-12-04 04:12:39 25 4
gpt4 key购买 nike

我在使用 Ninject 的 UnitTesting 项目中使用 Moq 时遇到问题。

首先是关于我的解决方案的几行。它包含几个项目(BussinesLogic、DAL、基础设施......)。我的目标是对我在 BussinessLogic 项目中使用的逻辑进行单元测试。
该解决方案基本上是针对 Windows 服务的,但我已经输入了逻辑,因此它可以独立运行。我正在使用 Ninject 并指定天气我想使用 ProductionModule 或 TestingModule(Windows 服务使用 ProductionModule,控制台应用程序使用 TestingModule)

每当我在应用程序中需要它时,我都会使用工厂模式来获取 ninject 内核。

我的 TestingModule 继承自 NinjectModule,我在其中重写 Load() 方法并在那里进行绑定(bind)。例如:
Bind<IStorageManager>().To<StubStorageManager>();
我有 StubStorageManager 但它是空的。它只包含来自 IStorageManager 的方法声明。

我想做的是(用外行的话):
创建一个unitTest,我将在其中创建一个新内核,指定TestingModule 作为它的参数。然后我想创建一个模拟对象(假设是 IStorageManager 的模拟) storageManagerMock。 IStorageManager 中的某些方法返回一个 messageObject,所以我可能也需要模拟它,因为业务逻辑正在基于该 messageObject 做一些事情。所以我想以某种方式为该消息对象设置属性,然后在其上调用一些 businessLogic 方法,这样我就可以查看逻辑是否正常工作。

我希望我没有把它复杂化太多。

请耐心等待,我对模拟和依赖注入(inject)完全陌生,但愿意学习。

最佳答案

我怀疑您是否真的想在测试中使用 Ninject。使用 ninject 的全部意义在于您可以解耦所有内容。如果可能,您还想尝试将所有内容与依赖容器本身分离。如果必须将其传入,或者传入创建所需对象并让容器传入工厂的工厂。

我怀疑你可能想做这样的事情:

public void ATest(){
//create a mock StorageManager
var managerMock = new Mock<IStorageManager>();
//create a mock MessageObject to be used by business logic
var messageObjectMock = new Mock<MessageObject>();

//have the storage manager return the mock message when required
managerMock.Setup(x => x.GetMessageObject()).Returns(messageObjectMock.Object);
//set up message expectations
messageObjectMock.Setup(x => x.ThisValueExpected).Returns(10);
messageObjectMock.Setup(x => x.ThisFunctionShouldBeCalled()).Verifiable("Function not called.");

//thing to test
BusinessLogicObject blo = new BusinessLogicObject(managerMock.Object);
blo.DoTheThingImTesting();

//make sure the business logic called the expected function, or do whatever check you need...
messageObjectMock.Verify();
}

关于unit-testing - 使用 Moq 模拟对象,在进行单元测试时使用 Ninject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5832420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com