2009-07-29 5 views
24

Моя команда недавно приняла решение использовать Moq в качестве нашей издевательской структуры для ее огромной гибкости и высоко читаемого синтаксиса. Поскольку мы новичок в этом, я натыкаюсь на то, что кажется простым вопросом - поиски (здесь, Google и т. Д.) Находят много дискуссий о других нюансах Moq, но не обязательно, что мне нужно, и несколько, казалось бы, связанных вопросов превратились в красные сельди.«Короткие замыкающие» методы с Moq?

Мы тестируем класс с внешней зависимостью (Amazon SimpleDb, если быть точным), но не хотим, чтобы наши тесты были связаны с живым подключением. Конкретный метод:

  • Применяется некоторые «бизнес» логика
  • В случае необходимости, вызывает взывать к SDB через провайдера мы построили, давайте назовем его SaveItem()

Я хочу единицу протестируйте это так, чтобы мы установили необходимый контекст и обеспечили, чтобы был вызван SaveItem(), но таким образом, что SaveItem() действительно не вызывается (поскольку A) поставщик к SDB является макетом, который не полностью гидратирован и, скорее всего, будет бомбить, а B) Я не хочу платить за эту транзакцию сотни и тысячи раз).

При использовании методов, которые возвращали значение, это было тривиально.

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo"); 

В том случае, когда я очертить выше, хотя, мой «SaveItem()» метод является недействительным и, следовательно, возможность использовать Returns() метод MOq не доступно. И хотя я могу настроить обратный вызов, чтобы подтвердить, что вызывается SaveItem(), я, однако, не могу заставить его фактически ничего не делать.

Naive/надежды, я думал, что следующий будет работать, но это, кажется, до сих пор вызывает метод:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())); 

Так вопрос на миллион долларов: Что Moq следующего фиктивного кода?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE(); 
+0

Edited прояснить ситуацию, тест для класса «бизнес» плавающей вокруг, а не для фактической реализации SimpleDB. Реализация SimpleDB протестирована в другом месте, вот что я издеваюсь. – bakasan

ответ

29

Если метод SaveItem() является виртуальным или абстрактным, и вы не устанавливая Callbase = true, то метод должен быть повторно реализован не делать ничего по Мок.

Вы должны быть в состоянии сделать:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable(); 

... test here ... 

mockDb.Verify(); 
+0

Отлично! Абсолютно не подозревал, что намерение файла Verifiable()/Verify(), а также более формальной документации, даже не было бы известно, чтобы читать темы и сообщения в этой области. Просто дал ему вихрь, и теперь у меня есть как положительные, так и отрицательные тесты. Большое спасибо! – bakasan

+2

+1; Кроме того, вы также можете проверить все свои вызовы независимо от флага Verifiable(), вызвав mockDb.VerifyAll() –

+0

Возможно, этот ответ будет расширен для другого сценария. I.e метод не является ни виртуальным, ни абстрактным? – leon

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