День 1352. #ЗаметкиНаПолях
Проверка Порядка Выполнения с Помощью Юнит-тестов
Прежде всего, давайте проясним: этот пост не о порядке выполнения юнит-тестов. Никогда не следует рассчитывать на то, что тесты выполняются в каком-либо порядке. Мы же поговорим о проверке порядка выполнения операций внутри определённого метода с помощью тестов. Иногда вам нужно сделать больше, чем просто проверить правильность вызова методов.
Предположим, что мы реализуем сервис-оркестратор, который должен выполнить работу, а затем сообщить об исполнении. Хорошо бы, чтоб уведомление отсылалось после выполнения работы.
Для этого мы можем воспользоваться функцией обратного вызова Moq. Она позволяет нам выполнить код сразу после вызова метода. С её помощью мы можем установить флаг, чтобы отслеживать, когда был вызван метод, а затем использовать этот флаг, чтобы проверить, был ли второй метод вызван в нужное время:
public class JobService
{
private IWorkService ws;
private INotifyService ns;
// внедряем сервисы через DI
public void DoAndNotify()
{
ws.DoJob();
ns.Notify();
}
}
А вот наш тест:
[Test]
public void ShouldNotifyAfterJob()
{
var wsMock = new Mock<IWorkService>();
var nsMock = new Mock<INotifyService>();
var sut = new JobService(
wsMock.Object,
nsMock.Object);
var jobExecuted = false;
var notified = false;
wsMock.Setup(x => x.DoJob())
.Callback(() => jobExecuted = true);
nsMock.Setup(x => x.Notify())
.Callback(() => notified = jobExecuted);
sut.DoAndNotify();
Assert.That(notified, Is.True);
}
Что тут происходит:
- Создаём моки зависимостей и сервис.
- Устанавливаем функцию обратного вызова для метода DoJob, поэтому при его вызове флаг jobExecuted будет установлен в true.
- Устанавливаем функцию обратного вызова для метода Notify, в котором флаг notified будет истинным только, если jobExecuted имеет значение true.
Итого
Всего в паре строк кода мы проверяем порядок выполнения с помощью юнит-тестов. Более того, для этого нам даже не пришлось изменять наш код. Аналогично можно проверять и более сложные случаи.
Источник: https://intodot.net/verifying-the-execution-order-with-unit-tests/