7

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

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

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

我的 TestingModule 继承自 NinjectModule,我在其中重写 Load() 方法并在那里进行绑定。例如:

Bind<IStorageManager>().To<StubStorageManager>();

我有 StubStorageManager 但它是空的。它只包含来自 IStorageManager 的方法声明。

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

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

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

4

1 回答 1

12

我怀疑您是否真的想在测试中使用 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();
 }
于 2011-04-29T14:00:09.847 回答