2009-06-11 9 views
87

Какова цель Verifiable()?Какова цель проверки() в Moq?

Если я проверю Mock и оставьте это, он по-прежнему проверяет SetUp.

Редактировать: Я использовал VerifyAll(), поэтому причина для всего, что проверяется. После замены на Verify() проверялись только мои .Verifiable()SetUp.

ответ

57

ДОПОЛНЕНИЕ: В других государствах ответа, цель .Verifiable является завербовать Setup в набор «отложенных Verify(...) вызовов», которые затем могут быть вызваны с помощью mock.Verify().

уточнение Ор проясняет, что это была цель, и единственная проблема была выяснить, почему он не работает, но, как ткнул @Liam, ответ должен действительно коснуться этого тоже: - Ключ использования случаев, насколько я могу видеть, являются:

  • поддержания Сухость между mock.Setup() и mock.Verify
  • позволяющий отсоединять конфигурирование в проверке с самого (например, вы можете установить его в другой фактической Verify вызова вспомогательный метод)

... и вернемся к моему ответу, в котором, как правило, говорится: «Будьте осторожны, поскольку вышеупомянутые плюсы обычно считаются перевешенными тем, что достижение этих целей зависит от удобочитаемости и ремонтопригодности тестов, которые слишком много опираются на такие конструкции»

ORIGINAL: Обратите внимание, что там, где это возможно, следует вместо этого следовать AAA расположение и, следовательно, один должен быть doing explicit mock.Verify(expression) calls after the work has been done, rather than a mock.Setup(...).Verifiable() paired with a mock.Verify() or mock.VerifyAll() везде, где это возможно (кредит: @kzu).

+0

Чтобы уточнить - если мне нужен макет, чтобы что-то вернуть в тестируемый код, это тот случай, когда 'Setup (...)' (в моем разделе упорядочивания) и 'VerifyAll()' (в моем утверждении раздел) было бы уместным? –

+5

@ EricSmith Оглядываясь назад, не думаю, что я выразился достаточно сильно. Большую выгоду от разделения вашей работы на объединение AAA, чем избыток концентрации на общности между фазой Arrange и Assert. В 90% случаев есть что-то, что можно получить от нюансов о том, как вы выражаете вызовы Verify в конце, поэтому вам нужно потратить много времени, чтобы оптимизировать для этого, даже если в некоторых случаях, если это похоже на какое-то болезненное дублирование. Один из пунктов http://manning.com/osherove делает очень хорошо, так это то, что делать тест имеет смысл для кого-то, кто прыгает в критический момент - так придерживайтесь условностей! –

+2

Я, как правило, не против противоречия принятой мудрости, но до сих пор не убежден в преимуществах AAA против 'Verifyable()'/'VerifyAll()' во всех случаях. Мой текущий модульный тест содержит большое количество вызовов 'Setup (...)' (> 30). Может соответствовать каждому из них с эквивалентом Verify(), чтобы удовлетворить соглашение, но это приводит к большому дублированию кода и будет сложнее поддерживать и читать по мере увеличения количества модульных тестов. Я предполагаю, что я действительно спрашиваю, могут ли исключения быть сделаны, если существует большое количество установок или это предотвращение 'Verifiable()' жесткого и быстрого правила? –

39

Когда метод Verify() вызывается в конце теста, если какие-либо из ожиданий, отмеченных как проверяемые, не были вызваны, то исключение составляет thrown.

VerifyAll() не проверяет поддающиеся проверке ожидания.

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