моя команда недавно приняла решение использовать Moq в качестве нашей насмешливой структуры для ее огромной гибкости и высоко читаемого синтаксиса. Поскольку мы новичок в этом, я натыкаюсь на то, что кажется простым вопросом - поиски (здесь, Google и т.д.) Находят много дискуссий о других нюансах Moq, но не обязательно, что мне нужно, и несколько, казалось бы, связанных вопросов превратились в красные сельди.
Мы тестируем класс с внешней зависимостью (Amazon SimpleDb, если быть точным), но не хотим, чтобы наши тесты были связаны с живым подключением. Конкретный метод:
- Применяет некоторую "бизнес-логику"
- При необходимости вызывается вызов SDB через поставщика, который мы создали, позвоните ему
SaveItem()
Я хочу, чтобы unit test это так, что мы настраиваем необходимый контекст и гарантируем, что SaveItem()
был вызван, но таким образом, что SaveItem()
действительно не вызывается (поскольку A) поставщик в SDB является макетом который не полностью гидратируется и, скорее всего, будет бомбить, и B) я не хочу платить за эту транзакцию сотни и тысячи раз).
При использовании методов, возвращающих значение, это было тривиально.
mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");
В том случае, если я выше описываю выше, мой метод "SaveItem()
" недействителен, и поэтому возможность использования метода Moq Returns()
недоступна. И хотя я могу настроить обратный вызов для проверки SaveItem()
, я не могу заставить его фактически ничего не делать.
Наивный/надежный, я думал, что следующее будет работать, но он все еще вызывает метод:
mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));
Итак, вопрос в миллион долларов: какой мок из следующего фиктивного кода?
mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();