Проверка порядка выполнения с помощью модульных тестов
Прежде всего, давайте проясним кое-что: этот пост нет об исполнительном листе модульных тестов так как настоятельно не рекомендую этого делать, т.к. подробнее можно прочитать о здесь. Речь идет о проверке порядка выполнения с помощью модульных тестов методы внутри определенного метода. И зачем мне это, спросите вы? Что ж, иногда вам нужно сделать больше, чем просто убедиться, что вызываются правильные методы. Например, предположим, что вы реализуете метод BreakfastRoutine в своем классе Human. Было бы очень хорошо, если бы он всегда чистил зубы после ешь, да? Я, например, считаю, что моя реализация этого метода иногда дает сбой.
Как это сделать
Для этого мы можем воспользоваться Обратный вызов Moq особенность. Проще говоря, это то, что позволяет нам выполнить часть кода сразу после вызова метода. С его помощью мы можем установить флаг, чтобы отслеживать, когда был вызван метод, а затем использовать этот флаг, чтобы проверить, был ли вызван второй метод в нужное время. Продолжая наш пример с завтраком, давайте посмотрим, как это выглядит в коде.
Вот наш Human.cs:
public class Human
{
public IHygieneFunctions HygieneFunctions { get; }
public IMouthStuff MouthStuff { get; }
public Human(IHygieneFunctions hygieneFunctions, IMouthStuff mouthStuff)
{
HygieneFunctions = hygieneFunctions;
MouthStuff = mouthStuff;
}
public void BreakfastRoutine()
{
MouthStuff.ChewYummyYummies();
HygieneFunctions.BrushTeeth();
}
}
Просто, верно? И это будет наш тест:
[Test]
public void BreakfastRoutine_ShouldBrushTeethAfterEating()
{
var hygieneFunctionsMock = new Mock<IHygieneFunctions>();
var mouthStuffMock = new Mock<IMouthStuff>();
var human = new Human(hygieneFunctionsMock.Object, mouthStuffMock.Object);
var hasChewed = false;
var teethBrushedAfterChewing = false;
mouthStuffMock.Setup(x => x.ChewYummyYummies()).Callback(() => hasChewed = true);
hygieneFunctionsMock.Setup(x => x.BrushTeeth()).Callback(() => teethBrushedAfterChewing = hasChewed);
human.BreakfastRoutine();
Assert.That(teethBrushedAfterChewing, Is.True);
}
Итак, что происходит:
- Мы создаем наши макеты и наши Человек
- Мы устанавливаем обратный вызов для ChewYummyYummies метод, поэтому, когда он вызывается, он устанавливает пожевал пометить как истинный
- Мы также устанавливаем обратный вызов для Чистить зубы метод, поэтому он будет верным только в том случае, если пожевал переменная верна, что позволяет нам проверить, что мы хотим
Заключение
Довольно просто, верно? С помощью всего лишь нескольких логических строк мы проверяем порядок выполнения с помощью модульных тестов, спасая нашего любимого человека от необходимости дважды чистить зубы и, возможно, опоздать на поезд. Более того, нам даже не пришлось модифицировать наш код для достижения нашей цели, сохраняя наши решения максимально чистыми.
Первоначально опубликовано на вточка.нет