Как использовать Ninject.MockingKernel? - PullRequest
3 голосов
/ 16 марта 2011

Я пытаюсь использовать Ninject.MockingKernel.Moq.У меня 2 проблемы:

  1. Я должен зарегистрировать все типы, которые я хочу издеваться.Если я этого не сделаю, вызывается конструктор без параметров моего класса, и это не предназначено для автомокера
  2. Кажется, что даже если вызывается макет, проверка не удалась.Посмотрите на следующий образец

Пример кода:

//Arrange
var kernel = new Ninject.MockingKernel.Moq.MoqMockingKernel();
kernel.Bind<ClassUnderTest>().ToSelf();
kernel.Bind<ILogger>().ToMock();
kernel.GetBindings(typeof(ILogger));
//Act
var sut = kernel.Get<ClassUnderTest>();
sut.DoSomething();//Logger.Log is called inside that method
//Assert
var mock = kernel.GetMock<ILogger>();
mock.Verify(x => x.Log(It.IsAny<string>()), Times.Exactly(1));

1 Ответ

8 голосов
/ 17 марта 2011

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

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

Интерфейсы с другой стороны не требуют привязки.

Если вы хотите макетировать классы, вы должны определить

// note the scope so that you can access it later again
kernel.Bind<Foo>().ToMock().InSingletonScope(); 
var mock = kernel.GetMock<Foo>()
...