Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 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/