Как я могу установить флаги, которые мое приложение будет видеть, когда оно работает под XCTest?

KIF работает как волшебство, что-то меня сильно озадачило в последнее время. Именно так работают KIF и XCTest.

В WWDC 2014 и 2013 сказано: тестовый код внедряется в хост-приложение как своего рода плагин, так какую информацию можно подслушать из основного приложения как плагин? Какая связь между Host Application и Plugin??

Используя KIF, мы можем почувствовать запрос уведомлений и URL, но как это работает? Моя первая мысль - весь контекст в хост-приложении используется совместно с плагином. Но почему в тесте мы не можем изменять переменные в основном приложении?

Например:

у нас есть две цели:

Волшебный проект

- MagicApp

- MagicUITest <- цель KIFTest

Предположим, у меня есть файл с именем MagicClass:

class MagicClass {
  static var a = 1
}

Это возможно, если я хочу изменить эту переменную в MagicUITest?

Проблема, с которой я столкнулся прямо сейчас, заключается в том, как я могу ввести другой UIViewController в RootViewController, чтобы я мог запускать тест KIF из каждого отдельного ViewController и не нуждаться в постоянном прохождении процесса входа в систему... мое предположение примерно такое:

в MagicApp:

class AppDelegate : .. , .. {
  func application(application: UIApplication, willFinishLaunchingWithOptions   launchOptions: [NSObject : AnyObject]?) -> Bool {
   if MagicClass.a == 1 {
      window.rootViewController = AViewController()
   } else {
      window.rootViewController = BViewController()
   }
  }
}

в настройках KIFTest ():

setUp() {
  Magic.a = 2
}

Но не работа..

Во-первых, Magic.a = 2 не изменит Magic.a в MagicApp, во-вторых, функция приложения (..,..,..) завершится до вызова setUp()..

Любая идея?

1 ответ

Хотя вы и правы, что именно тот код, который вы пробовали, не будет работать, вы сможете использовать очень похожий подход.

Этот код, например, загружается непосредственно из приложения, над которым я сейчас работаю, в классе под названием RootViewController это (как вы уже догадались) корневой контроллер приложения:

public override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    if NSProcessInfo.processInfo().environment["TESTING"] == nil {
        loadChildren()
    }
}

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

Вы можете установить переменную окружения, отредактировав схему в Xcode:Снимок экрана с описанием добавления переменной среды

Все, что сказано, однако: будьте осторожны при использовании этой стратегии. Вы хотите, чтобы ваши тесты тестировали функции вашего приложения в том виде, в котором они существуют в вашем приложении, и если произвольное отображение разных экранов является функцией вашего приложения, это, вероятно, нормально. Но если вы начнете писать код, который заставляет ваше приложение вести себя по-другому во время тестирования, вы больше не тестируете свое приложение, не так ли?

Другие вопросы по тегам