2015-11-16 3 views
0

У меня есть следующий код в тесте в моем коде. Обратите внимание, что этот тест не был написан мной, код, который он вызывает, также не был написан мной, но я его изменил.Проверка Moq не работает, так как это должно быть

 mockedIMessage.Setup(m => m.ScriptMethodInvoker(EnumFunction.MsgFullSetPosition, It.IsAny<Result>())).Returns(1).Verifiable(); 
     var result = GetTestExecutionResult(script); 
     mockedIMessage.Verify(m => m.ScriptMethodInvoker(EnumFunction.MsgFullSetPosition, It.IsAny<Result>()), Times.Once); 

С оригинальным кодом это работает. По моему, это не так - это говорит мне, что ожидаемый призыв к макету был 0 раз, а не тот, который когда-то ожидался.

Однако, когда я выполняю его в режиме отладки, он определенно вызывает этот код и завершает работу без исключения исключения. Таким образом, код работает, но Moq не обнаруживает, что он был вызван.

+0

Этот метод вы называете виртуальным? – Domysee

+0

как вы изменили исходный код? - разместите свои изменения/код ... – Carsten

+0

Функции не являются виртуальными, но теперь они называются лямбда-функциями. Это основное функциональное изменение. Ни у одного из 2000 тестов нет проблем, но это может быть другим, используя Verify. –

ответ

1

Из того, что вы предоставили, множественные ошибки могли быть сделаны:

  • Убедитесь, что вы звоните ScriptMethodInvoker() на издевались IMessage например
  • If ScriptMethodInvoker() имеет перегрузкам, убедитесь, что право один называется
  • Удостоверьтесь, что EnumFunction является перечислением
  • Если EnumFunction не является перечислением, тогда удостоверьтесь, что EnumFunction.MsgFullSetPosition всегда возвращает тот же экземпляр
  • Удостоверьтесь, что GetTestExecutionResult() действительно звонит ScriptMethodInvoker().
+0

Это полезный контрольный список - я прошел через него в значительной степени, однако, когда я пришел к последнему, вот где проблема. IMessage - это насмешливый объект в точке вызова, но когда я вызываю IMessage.ScriptMethodInvoker, он не возвращает результат, указанный в mock выше (1 в этом случае). Поэтому я предполагаю, что это как-то вызывает неправильную версию этого (хотя, как я еще не уверен). –

+0

Честно говоря, приведенный вами образец кода не имеет особого смысла в плане модульного тестирования: вы настраиваете макет, чтобы что-то возвращать на конкретный вызов, но тогда вы только убедитесь, что тот же метод вызывается в макете. Вы должны скорее проверить, что данные, которые возвращает mock, используются правильно позже. Также '.Verifiable()' можно удалить, когда вы используете 'Verify (...)' с параметрами, определяющими, что должно быть проверено. –

+0

Вы получаете знак решения, потому что повторно проверяете эти предметы, и я нашел его - ошибка с моей стороны (я не звонил MsgFullSetPosition, но что-то очень похожее и не заметил разницы) –

Смежные вопросы