Насмешка объекта с Moq, используя Ninject при выполнении UnitTesting - PullRequest
7 голосов
/ 29 апреля 2011

У меня проблемы с использованием Moq в проекте UnitTesting с Ninject.

Сначала несколько строк о моем решении.Он содержит несколько проектов (BussinesLogic, DAL, Infrastructure ...).Моя цель - протестировать логику, которую я использую в проекте BussinessLogic.Решение в основном для службы Windows, но я ввел логику, чтобы он мог работать автономно.Я использую Ninject, и я указываю погоду, я хочу использовать ProductionModule или TestingModule (служба Windows использует ProductionModule, консольное приложение использует TestingModule)

Я использую фабричный шаблон для получения недействительного ядра, когда мне это нужновнутри моего приложения.

Мой TestingModule наследуется от NinjectModule, где я переопределяю метод Load () и там я делаю привязку.Например:

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

У меня есть StubStorageManager, но он пуст.Он содержит только объявление методов из IStorageManager.

Я хотел бы сделать следующее (в терминах непрофессионалов): создать unitTest, где я бы создал новое ядро, указав в качестве параметра TestingModule.Затем я хотел бы создать фиктивный объект (скажем, макет IStorageManager) storageManagerMock.Какой-то метод в IStorageManager возвращает messageObject, так что мне, вероятно, нужно было бы и над этим посмеяться, потому что логика бизнеса делает что-то на основе этого messageObject.Поэтому я хотел бы как-то установить свойства для этого объекта сообщения, а затем вызвать для него некоторый метод businessLogic, чтобы я мог видеть, работает ли логика правильно.

Надеюсь, я не слишком усложнил это.

Пожалуйста, потерпите меня, я совершенно не знаком с насмешками и зависимостями, но готов учиться.

1 Ответ

12 голосов
/ 29 апреля 2011

Я сомневаюсь, что вы действительно хотите использовать 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();
 }
...