Моя команда недавно приняла решение использовать 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();
Edited прояснить ситуацию, тест для класса «бизнес» плавающей вокруг, а не для фактической реализации SimpleDB. Реализация SimpleDB протестирована в другом месте, вот что я издеваюсь. – bakasan