Я запускаю модульные тесты в проекте библиотеки классов с инфраструктурой NSpec, AutofacContrib.NSubstitute v3.3.2.0, NSubstitute v1.7.0.0 (последняя на данный момент версия 1.8.2).
Экземпляр Class Under Test создан с использованием AutoSubstitute
, чтобы автоматически создавать макеты всех необходимых зависимостей.
AutoSubstitute autoSubstitute = new AutoSubstitute();
MainPanelViewModel viewModel = autoSubstitute.Resolve<MainPanelViewModel>();
При правильной работе мой тестируемый класс в какой-то момент вызовет один из методов его базового класса с определенным входным параметром (базовый класс находится вне моего контроля):
// ...
base.ActivateItem(nextScreen);
// ...
Итак, для ожидания теста мне нужно проверить (шпионить), что экземпляр вызывает базовый метод:
viewModel.Received().ActivateItem(Arg.Any<SomeSpecificScreenType>());
Вот проблема: когда я пытаюсь это сделать, во время выполнения NSubstitute жалуется, что я могу запустить только Received()
для объекта, созданного с помощью Substitute.For<>()
. Я также быстро проверил исходный код AutofacContrib.NSubstitute, но не смог найти способ получить экземпляр с автомокингом и при этом завернуть его как-то в шпионский объект или что-то в этом роде.
Я также подумал, что, возможно, Substitute.ForPartsOf<>()
может быть полезен, но этот метод, похоже, не найден в NSubstitute v1.7.0.
Для полноты здесь полная ошибка NSubstitute:
Методы расширения NSubstitute, такие как .Received(), можно вызывать только для объектов, созданных с помощью Substitute.For() и связанных методов.
ActivateItem
в базовом классе, а не проверять, вызывается ли сам метод (что, по сути, является деталью реализации). Есть ли причина, по которой вы не можете этого сделать?Subsitute.ForPartsOf
может помочь, но, как правило, не стоит имитировать класс, который вы тестируете. Метод, который вы хотите протестировать, также должен быть виртуальным, поэтому без его тестирования я скептически отношусь к тому, что явный вызовbase.ActivateItem
все равно вызовет замену. Тестирование того, что делает метод, вероятно, будет проще. - person forsvarir   schedule 25.06.2015ActivateItem
будет сложно, учитывая, что мы переходим в область просмотра пользовательского интерфейса. Но потом я просто вспомнил, что еще должно быть свойствоActiveItem
... так что сейчас я просто проверю, что - person superjos   schedule 25.06.2015