Moq и Transactionscope, вы можете заставить moq не считаться? - PullRequest
0 голосов
/ 04 февраля 2011

Когда я использую транзакцию, которая не выполняется, moq по-прежнему видит все откатанные вызовы в базу данных.

Есть ли способ сделать

_mockRepository.Verify(x => x.InsertSBI(It.IsAny<Int32>(), It.IsAny<Int32>(), It.IsAny<String>()), Times.Never());

И не

_mockRepository.Verify(x => x.InsertSBI(It.IsAny<Int32>(), It.IsAny<Int32>(), It.IsAny<String>()), Times.Exactly(4));

, чтобы тест прошел успешно?

1 Ответ

3 голосов
/ 15 ноября 2011

На ум приходит пара стратегий.

  • Создайте класс-оболочку для существующего класса доступа к БД.Дайте этой оболочке дождаться переадресации любых вызовов в базовую реализацию, пока вы не вызовете Commit.

Я не рекомендую это.Это была бы бессмысленная абстракция, зарезервированная только для тестирования, потому что реальный класс БД (вероятно) делает то же самое под прикрытием.Он будет ждать вызова БД, пока не будет вызван Commit.

  • Не пытайтесь проверять доступ к данным таким способом.Вместо этого подтверждает, что Commit не называется .

То, что вы пытаетесь сделать, это проверка с учетом состояния - выпроверяется состояние этих вызовов на основе того, как Commit и Rollback влияют на них.Это неправильный способ использования mocks.

Если вы подтвердите, что Commit не был вызван, вы тестируете высокоуровневое поведение кода, который откатывает транзакцию, иего взаимодействие с классом БД.Вы проверяете, что откат вызван, и что коммит не вызван, и верите, что он будет правильно обрабатывать детали.

Что-то вроде:

_mockRepository.Verify(x => x.Commit(), Times.Never());
_mockRepository.Verify(x => x.Rollback(), Times.Once());

Если вам нужно проверить БДСам класс, вы можете смоделировать его соединение с БД и убедиться, что вызовы не выполняются, если вызывается Rollback.Но вам не следует проводить такого рода тестирование, если только вы не тестируете модулем этот класс БД напрямую.

...