Ответ 1
Абсолютно!
Вам нужна чистая среда приложения, в которой вы можете запускать свои тесты - чистый список.
Все приложения имеют делегат приложения, который устанавливает начальное состояние приложения и предоставляет запуск корневого контроллера. Для целей тестирования вы не хотите, чтобы это произошло - вы должны быть в состоянии тестировать изолированно, без всех этих событий. В идеале вы хотите, чтобы у вас был экран, и загружен только этот экран, и никаких других изменений состояния не происходит.
Для этого вы можете создать объект только для тестирования, который реализует UIApplicationDelegate
. Вы можете сказать, что приложение запускается в "режиме тестирования" и использует делегат приложения для тестирования, используя аргумент запуска.
Цель-C: main.m:
int main(int argc, char * argv[]) {
NSString * const kUITestingLaunchArgument = @"org.quellish.UITestingEnabled";
@autoreleasepool {
if ([[NSUserDefaults standardUserDefaults] valueForKey:kUITestingLaunchArgument] != nil){
return UIApplicationMain(argc, argv, nil, NSStringFromClass([TestingApplicationDelegate class]));
} else {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([ProductionApplicationDelegate class]));
}
}
}
Swift: main.swift:
let kUITestingLaunchArgument = "org.quellish.UITestingEnabled"
if (NSUserDefaults.standardUserDefaults().valueForKey(kUITestingLaunchArgument) != nil){
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(TestingApplicationDelegate))
} else {
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))
}
Вам придется удалить любую аннотацию @UIApplicationMain
из ваших классов Swift.
Для "прикладных тестов" обязательно установите действие "Тест" схемы в Xcode, чтобы предоставить аргумент запуска:
Для тестов пользовательского интерфейса вы можете установить аргументы запуска как часть теста:
Objective-C:
XCUIApplication *app = [[XCUIApplication alloc] init];
[app setLaunchArguments:@[@"org.quellish.UITestingEnabled"] ];
[app launch];
Swift:
let app = XCUIApplication()
app.launchArguments = [ "org.quellish.UITestingEnabled" ]
app.launch()
Это позволяет тестам использовать делегат приложения специально для тестирования. Это наделяет вас большим контролем - теперь у вас есть пустой сланец для работы. Делегат приложения тестирования может загрузить конкретную раскадровку или установить пустой UIViewController
. В рамках ваших тестов пользовательского интерфейса вы можете создать экземпляр контрольного контроллера представления и установить его в качестве keyWindow
корневого keyWindow
или представить его в виде модально. После того, как он будет добавлен или представлен, ваши тесты могут быть выполнены, и когда они будут удалены или отменены.