Скажем, у меня есть интерфейс ITest
, который имеет один метод:
public interface ITest
{
bool IsEvent(int input);
}
Затем я хочу высмеять это - и помните, сейчас у меня есть нет фактический конкретный класс.
var mock = new Mock<ITest>();
Теперь я хочу установить 2 звонка:
mock.Setup(x => x.IsEven(1)).Returns(false);
mock.Setup(x => x.IsEven(2)).Returns(true);
Это говорит фиктивному объекту:
Если ваш метод IsEven вызывается со значением 1, вернуть false.
Если ваш метод IsEven вызывается со значением 2, верните true.
Вы настраиваете поведение на своем объекте.
Итак, если я сделаю это в коде:
var for1 = mock.Object.IsEven(1);
var for2 = mock.Object.IsEven(2);
Переменная for1
будет ложной, а for2
будет истинной, потому что я сказал фиктивному объекту, что именно он должен делать. Параметр для Setup
фактически говорит: «Это поведение, за которым я хочу, чтобы вы следили, и я скажу вам, что делать». В моем случае я использую метод Returns
, чтобы указать, что фактически возвращается из моего фиктивного объекта в этом конкретном случае.
В вашем конкретном случае:
mockRepo.Setup(x => x.AddRecord(null))
.Raises(m => m.FailedDatabaseRequest += null, this, EventArgs.Empty);
Это говорит о высмеянном объекте
Если кто-то вызывает метод AddRecord с параметром null, тогда
вызвать событие типа FailedDatabaseRequest
Для получения дополнительной информации о методе Raises
см. Документацию по быстрому запуску Moq для событий здесь.
Для более глубокого просмотра событий с помощью Moq есть некоторая полезная информация здесь - в частности, речь идет о += null
, который вызывает у вас некоторую путаницу:
Чтобы вызвать событие из фиктивного объекта, мы используем его метод Raise. это
принимает два параметра. Первое - это лямбда-выражение, которое включает
пустой подписчик события для события, чтобы поднять. Хотя не то
самый элегантный синтаксис, это необходимо, чтобы позволить Moq понять, как
событие используется. Второй параметр предоставляет аргументы события
это будет включено в событие.