IOS Swift: отдельный AppDelegate для XCTest
Из-за пары проблем я хочу, чтобы цель XCTest в проекте запускала отдельный делегат приложения. Используя ObjC, это был относительно простой процесс: манипулируйте main.m
(см.: qaru.site/info/124683/...).
Так как кажется, что приложение Swift инициализировано с помощью @UIApplicationMain
в AppDelegate, можно ли инициализировать отдельный AppDelegate для целевой цели?
Ответы
Ответ 1
Настоятельно не рекомендуется добавлять условия к нормальной проверке кода, если его тестируют. Вместо этого вы должны издеваться над AppDelegate
в тестах, чтобы делать все, что хотите.
Затем вы можете заменить делегирование UIApplication setUp
в суперклассе ваших XCTestCase
'es.
class MockAppDelegate:NSObject, UIApplicationDelegate {
}
class BaseTest: XCTestCase {
override func setUp() {
super.setUp()
UIApplication.sharedApplication().delegate = MockAppDelegate()
}
}
class Test1: BaseTest {
override func setUp() {
super.setUp()
// normal testing
}
}
Если вы все еще хотите остановить выполнение кода для тестов, это мой метод, который хорошо работает:
Вы можете добавить параметр запуска в приложение, что означает, что это тестовый прогон
![App Start execution]()
Эти параметры доступны из NSUserDefaults
#define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"]
Ответ 2
Это решение таково:
-
Дублируйте существующее приложение Target и переименуйте его в нечто подходящее. В вашем случае может быть "TestingHarness" или некоторые такие. Обратите внимание, что вы также захотите изменить идентификатор пакета и переименовать соответствующий файл Info.plist. Переименование файла Info.plist означает, что вам нужно изменить настройку имени файла Info.plist на новой вкладке "Параметры сборки" в соответствии с новым именем.
-
Создайте еще один *AppDelegate.swift
файл. В вашем случае я бы назвал его TestAppDelegate.swift
.
-
Скопируйте существующее содержимое AppDelegate.swift
в TestAppDelegate.swift
и отредактируйте его по желанию. Обязательно оставляйте аннотацию @UIApplicationMain
и выполняйте необходимые обратные вызовы UIApplicationDelegate
.
-
Измените целевое членство в каждом из ваших файлов *AppDelegate.swift
, чтобы AppDelegate.swift
не включался в ваш новый целевой объект TestHarness, а TestAppDelegate.swift
не включался в ваш основной объект приложения. (Вы редактируете целевое членство в файле, выбирая его в браузере файлов и открывая File Inspector, доступ к которому вы можете получить в правой боковой панели по умолчанию, или выбрав его в меню в меню "Вид" > "Утилиты".)
-
Теперь у вас есть две отдельные цели с отдельными делегатами приложения, которые можно создавать и запускать независимо. Последним шагом является выбор вашей новой цели TestHarness в качестве Host Application для ваших тестовых целей. (Щелкните запись проекта верхнего уровня в браузере файлов, а затем щелкните нужный тестовый объект в сублитере. На вкладке "Общие" вы увидите "Хост-приложение" как единственное доступное выпадающее меню.)
Примечание: эти инструкции предназначены для Xcode 7.2.