Подтвердить что ты не робот

"Короткие замыкающие" методы с Moq?

моя команда недавно приняла решение использовать 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();
4b9b3361

Ответ 1

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

Вы должны уметь:

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

...  test here ...

mockDb.Verify();