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