Издевательство над модульным тестом iOS с использованием Swifty Mocky

Nov 28 2022
Swift был разработан, чтобы быть безопасным — поддерживать отражение только для чтения. Таким образом, нет возможности изменить вашу программу во время выполнения.

Swift был разработан, чтобы быть безопасным — поддерживать отражение только для чтения. Таким образом, нет возможности изменить вашу программу во время выполнения. В целом все хорошо, код выполняется как положено, и другие компоненты не могут его изменить. Но возвращаясь к нашей теме, все фиктивные фреймворки построены на рефлексии, чтобы иметь возможность изменять классы, типы и объекты во время выполнения.

Этому языку нужны свои супергерои для написания тестируемого кода, и мы их хорошо знаем — протоколы и расширения! Независимо от того, какая это реализация — класс, перечисление или структура — назначение протоколов остается — определять абстракции и добавлять новые функциональные возможности к типам, даже тем, которые мы не обязаны.

Что мы можем сделать, чтобы издеваться?

Используйте метапрограммирование для создания полной фиктивной реализации.

Это множество библиотек, выполняющих фиктивную работу для модульного тестирования, большинство тополей — это Cuckoo и swifyMocky .

В этой статье я дам обзор того, как мы можем сделать насмешку с помощью SwiftyMocky.

SwiftyMocky

https://github.com/MakeAWishFoundation/SwiftyMocky

Преимущества

  • Автоматически имитировать протоколы Swift
  • Поддержка дженериков
  • Простая настройка и легкий вес
  • Хорошая документация
  • Красивый и простой синтаксис (использующий автозаполнение)
  • Отметить протоколы для имитирования
  • Каждый протокол в исходных каталогах, имеющий эту аннотацию, будет добавлен в Mock.generated.swift.
  • Все макеты имеют данный метод (доступный как метод экземпляра, так и глобальную функцию) с простым в использовании синтаксисом, позволяющим указать, какие должны быть возвращаемые значения для данных методов (на основе указанных атрибутов).
  • Все макеты имеют метод проверки (доступный как метод экземпляра, так и глобальную функцию) с простым в использовании синтаксисом, позволяющим проверить, вызывался ли метод в макете и сколько раз. Он также предоставляет удобный способ указать, имеют ли значение атрибуты метода (и какие именно).
  • Все макеты имеют метод выполнения (доступный как как метод экземпляра, так и как глобальная функция) с простым в использовании синтаксисом, позволяющим указать закрытие, которое будет выполняться при вызове метода-заглушки.

Настраивать

  • Установить с помощью Cocoapods
  • Установите CLI для простого создания макетов

> swiftymocky doctor # подтвердите свои настройки

> swiftymocky generate # генерировать макеты

  • Генерация макетов основана на файле Mockfile.yml с возможностью исключения правил быстрой проверки с помощью excludeSwiftLintRules .

У нас, как у разработчиков, не так много инструментов для насмешек над Swift, с некоторыми строгими ограничениями из-за языкового ограниченного доступа во время выполнения. И тут мы подошли к критическому вопросу — использовать или не использовать внешние фреймворки для мокинга.

Знаменитый дядя Боб старается не использовать их как можно чаще; он говорит: «Точка, в которой вы начинаете нуждаться в фиктивной среде, — это та самая точка, в которой связь между вашими тестами и кодом становится слишком сильной. Однако после этого вы должны стремиться к тому, чтобы связь между вашим кодом и тестами была достаточно низкой, чтобы вам не приходилось слишком часто использовать фиктивный фреймворк».

Спасибо за чтение! Если вам понравилась эта статья, пожалуйста, хлопните в ладоши, чтобы другие люди тоже могли ее прочитать :)

Удачного кодирования :v: