Подтвердить что ты не робот

IOS Swift: отдельный AppDelegate для XCTest

Из-за пары проблем я хочу, чтобы цель XCTest в проекте запускала отдельный делегат приложения. Используя ObjC, это был относительно простой процесс: манипулируйте main.m (см.: qaru.site/info/124683/...).

Так как кажется, что приложение Swift инициализировано с помощью @UIApplicationMain в AppDelegate, можно ли инициализировать отдельный AppDelegate для целевой цели?

4b9b3361

Ответ 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.