Я запускаю модульные тесты в проекте библиотеки классов с NSpec framework, AutofacContrib.NSubstitute v3.3.2.0, NSubstitute v1.7.0.0 (последнее на данный момент 1,8,2).Как проверять класс под тестом с помощью AutofacContrib.NSubstitute
Класс испытания экземпляр построен с 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, но я не смог найти способ получить экземпляр с автопиляцией и в то же время wrap это как-то в объекте-шпионе или что-то в этом роде.
Я также подумал, что может быть полезным Substitute.ForPartsOf<>()
, но этот метод, похоже, не найден в NSubstitute v1.7.0.
Для полноты картины, вот NSubstitute полная ошибка:
NSubstitute extension methods like .Received() can only be called on objects created using Substitute.For() and related methods.
Вы действительно должны проверить, что имеет место поведение «ActivateItem» в базовом классе, а не проверка того, что сам метод вызван (что по сути является деталью реализации). Есть ли причина, по которой вы не можете этого сделать? 'Subsitute.ForPartsOf' * может * помочь, но, как правило, это плохая идея, чтобы издеваться над классом, который вы тестируете. Метод, который вы хотите протестировать, также должен быть виртуальным, поэтому, не тестируя его, я скептически отношусь к тому, что явный вызов 'base.ActivateItem' фактически вызовет замену в любом случае. Тестирование того, что делает метод, вероятно, будет проще. – forsvarir
Я полностью согласен с этим в целом. Я собирался ответить на ваш комментарий, что это модель просмотра CaliburnMicro, и проверять поведение «ActivateItem» было бы трудно, учитывая, что мы заходим в область просмотра пользовательского интерфейса. Но потом я просто напомнил, что также должно быть свойство «ActiveItem» ... так что теперь я просто проверю, что вы здесь, – superjos
! Теперь я задаюсь вопросом, стоит ли мне просто закрыть этот вопрос или что-то вроде – superjos