Как протестировать комбинированный код в Swift
Тестирование нашего кода является фундаментальной частью процесса разработки.
Но если мы используем платформу Combine, это может показаться неинтуитивным на первый взгляд. Это не значит, что это невозможно сделать. Нам просто нужно изучить некоторые более продвинутые концепции, которые предоставляет нам Swift.
Давайте посмотрим, как мы можем легко включить модульные тесты в наш код Combine.
Давайте начнем с рассмотрения следующего менеджера, который имитирует работу со светофором.
Из нашей первоначальной статьи Combine мы знаем, что, добавляя оболочку @Published, мы получаем бесплатный Publisher, доступ к которому можно получить с помощью символа $.
Тестирование
Прежде чем мы углубимся в то, как на самом деле тестировать код Combine, давайте рассмотрим некоторые основные понятия, касающиеся модульного тестирования. Мы можем обобщить его в три шага.
- Шаг 1: Определите, что вы хотите протестировать.
- Шаг 2: Выполните операцию, которую хотите протестировать, со значением, которое вы определили на шаге 1.
- Шаг 3: Оцените результат, полученный на шаге 2.
Это очень простой пример, чтобы вы могли понять концепцию. Сначала мы определили наше ожидаемое значение для теста, красный свет. Затем мы вызываем операцию, которая меняет текущее значение света на красный. И, наконец, мы убеждаемся, что текущее значение света совпадает с ожидаемым.
Это хорошо, но что нам делать, если мы хотим протестировать simulateFlow
функцию? Вы можете заметить, что внутри этой функции мы меняем свойство света три раза. Таким образом, в конце выполнения функции значение свойства должно измениться с зеленого на желтый, с желтого на красный и, наконец, с красного на зеленый.
Как вы можете себе представить, чтобы протестировать функцию, нам нужно убедиться, что значение свойства имеет правильное значение в конце, но самое главное, мы должны быть уверены, что все изменения значения (от одного к другому) верны. .
Ожидания
XCTestExpectations — это тип объекта, который Apple предоставляет нам для тестирования асинхронного кода. По сути, вы создаете ожидание в начале вашего теста, и когда выполняются определенные условия, вы оправдываете это ожидание. Выполнение теста будет ждать, пока ожидание не будет выполнено или когда истечет время ожидания.
Итак, чтобы протестировать нашу функцию, нам нужно будет подождать, пока мы не соберем все ожидаемые значения, которые, как мы знаем, currentLight
должны измениться. Тогда мы выполним ожидание, если получим все значения. В противном случае тест завершится неудачей из-за тайм-аута.
Имея это в виду, теперь у нас есть правильный инструмент для создания нового теста для нашей simulateFlow
функции .
Разберем код:
Шаг 1
- Мы создаем новое ожидание для использования в нашем тесте.
- Мы определили ожидаемые значения, которые, как мы знаем, свойство должно измениться в какой-то момент.
- Мы также создали новый пустой список, который будем использовать для хранения значений, которые мы получим от издателя.
- Мы начинаем прислушиваться к ценностям Издателя.
- Мы вызываем функцию, чтобы начать получать изменения значения свойства.
- Мы ждем, когда ожидание сбудется или будет достигнут тайм-аут.
- Мы оцениваем, верны ли полученные нами значения.
Тестировать код Combine довольно просто, если вы понимаете потенциал ожиданий. Хотя мы видели очень короткий и простой пример, вы можете использовать эту же технику для тестирования более сложных решений.
Например, вы можете применить эти принципы для проверки состояний ViewModel в архитектуре MVVM или для проверки некоторых фиктивных сетевых вызовов.
Возможно, вы захотите проверить мои предыдущие статьи о Combine.
Введение в структуру Combine в Swifthttps://blorenzop.medium.com/form-validation-with-combine-4988adcc3b0
Есть вопросы? Не стесняйтесь, напишите мне сообщение . Если вам нравится мой контент, вы можете подписаться на мою страницу в Medium, чтобы получать уведомления прямо в свой почтовый ящик, когда я публикую новую статью.
Если вы хотите поддержать меня, вы можете подписаться на меня в GitHub или Twitter .