2015-04-06 4 views
1

KIF работает как магия, что-то озадачило меня совсем недавно. Именно так работают KIF и XCTest.Как установить флаги, которые мое приложение увидит, когда оно будет запущено в XCTest?

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

Используя 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, второй является применение (.., .., ..) функция завершится перед установкой() называется ..

Любая идея?

ответ

1

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

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

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

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

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

Вы можете установить переменную окружения путем редактирования схемы в Xcode: Screen shot describing adding an environment variable

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

+0

Спасибо! Я это попробую. Случай, который мы хотим, чтобы приложение выглядело иначе, в основном связано с ложными сетевыми ответами. Например, зарегистрировать настроенный NSURLProtocol для протоколов NSURLSessionArray. –

 Смежные вопросы

  • Нет связанных вопросов^_^