Я изучаю Test Driven Development и пытаюсь использовать библиотеку Moq для насмешек. Какова цель метода установки класса Mock?
Макет объектов - Метод установки - Тестирование
Ответ 1
Поведение объекта 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)
.
Ответ 2
Метод установки используется для установки ожиданий на макет объекта Например:
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
Здесь вы устанавливаете метод DoSomething
на макет объекта. Вы говорите, когда параметр "ping", метод возвращает true.
Теперь этот объект может действовать как макет или заглушка в зависимости от вашего использования. Если вы хотите использовать его в тестировании на основе состояния, он может действовать как заглушка. Если вы хотите использовать его в тестировании на основе поведения, он может действовать как макет. При тестировании поведения вы вызываете метод проверки на объект-макет, чтобы утверждать, что метод был вызван с параметром "ping"
Далее ссылайтесь на эти ссылки: