Имитация объектов. Метод настройки. Разработка через тестирование - PullRequest
33 голосов
/ 05 июля 2010

Я изучаю Test Driven Development и пытаюсь использовать библиотеку Moq для макетовКакова цель метода установки класса Mock?

Ответы [ 2 ]

42 голосов
/ 06 июля 2010

Поведение по умолчанию для объекта Moq Mock - заглушка всех методов и свойств.Это означает, что вызов этого метода / свойства с любыми параметрами не завершится с ошибкой и вернет значение по умолчанию для определенного возвращаемого типа.

Вы вызываете метод Setup по любой или всем из следующих причин:

  • Вы хотите ограничить входные значения для метода.
public interface ICalculator {
  int Sum(int val1, val2);
}

var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  It.IsAny<int>(), //Any value
  3                //value of 3
));

Приведенная выше настройка сопоставит вызов метода Sum с любым значением для val1и val2 значение 3.

  • Вы хотите вернуть конкретное значение.Продолжая пример ICalculator, следующая установка вернет значение 10 независимо от входных параметров:
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  It.IsAny<int>(), //Any value
  It.IsAny<int>()  //Any value
)).Returns(10);
  • Вы хотите использовать Mock<T>.VerifyAll() после настройки, чтобы убедиться, чтовсе предыдущие настройки были вызваны (один раз).
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
  7, //value of 7
  3                //value of 3
));

mock.Setup(m=>m.Sum(
  5, //value of 5
  3                //value of 3
));

mock.VerifyAll();    

Приведенный выше код проверяет, что Sum вызывается дважды.Один раз с (7,3) и один раз с (5,3).

11 голосов
/ 05 июля 2010

Метод установки используется для установки ожиданий для фиктивного объекта. Например:

mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

Здесь вы устанавливаете метод DoSomething для фиктивного объекта.Вы говорите, что когда параметр "ping", метод возвращает true.

Теперь этот объект может в дальнейшем действовать как макет или заглушка в зависимости от вашего использования.Если вы хотите использовать его в тестировании на основе состояния, он может выступать в роли заглушки.Если вы хотите использовать его в тестировании, основанном на поведении, он может выступить в качестве насмешки.При тестировании поведения вы вызовете метод verify для фиктивного объекта, чтобы подтвердить, что метод был вызван с параметром "ping"

.1013 *http://code.google.com/p/moq/wiki/QuickStart

...