Настройка среды приложения с помощью KIF

Я использую KIF для тестирования пользовательского интерфейса. Первое, что я хочу сделать, это очистить все кешированные данные, которые могут быть в симуляторе. Поэтому я пишу код очистки в методе -beforeAll моего KIFTestCase. Но этот метод вызывается после вызова моего метода делегата приложения -application:didFinishLaunchingWithOptions:. На данный момент уже слишком поздно, мое приложение уже запущено и уже использовало кешированные данные.

Я мог бы изменить код своего приложения с помощью чего-то вроде if (NSClassFromString(@"KIFTestCase") { … }), но это кажется мне ужасным решением.

Есть ли простой способ выполнить некоторый код установки до выполнения моего кода приложения?

Обратите внимание, что я не могу использовать новую встроенную функцию тестирования пользовательского интерфейса Xcode, так как я хочу запускать тесты на iOS 8.


person 0xced    schedule 05.08.2015    source источник


Ответы (2)


Я бы, вероятно, выбрал одно из предложенных решений (мы лично проверяем NSClassFromString("XCTest") != nil)

Но если оба решения не работают для вас, и вы не возражаете против некоторой магии времени выполнения, вы можете:

  • Создайте динамический подкласс вашего класса AppDelegate, содержащий всю тестовую логику, и используйте object_setClass(appDelegate, [TestAppDelegate class]) для изменения класса экземпляра (вам потребуется ссылка на экземпляр вашего делегата приложения).
  • Или просто прокрутите методы в вопросах в +[TestHelper load], чтобы это произошло до того, как сработает делегирование приложения (потенциально вызывая исходную реализацию, которую вы сохранили до прокрутки)

Надеюсь, поможет!

person Sash Zats    schedule 05.08.2015
comment
Обычно я использую #ifdef KIF_XCTEST в AppDelegate, который определяется как макрос препроцессора. - person Daniele; 09.08.2015

Насколько мне известно из тестового примера KIF, нет прямой возможности выполнить настройку до запуска метода делегата приложения -application:didFinishLaunchingWithOptions:.

С другой стороны, вы можете вызвать сброс приложения из своего тестового примера. Я делаю это следующим образом:

  • Выполните настройку из тестового примера KIF (например, измените активный язык или установите какое-либо специальное свойство NSUserDefaults).

  • Отправьте уведомление с помощью NSNotificationCenter из тестового примера, чтобы вызвать сброс приложения.

[[NSNotificationCenter defaultCenter] postNotificationName:@"reset.app.state" object:self];
[tester waitForTimeInterval:1.0];
  • В делегате приложения мы ранее зарегистрировались для этого уведомления.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resetAppState:) name:@"reset.app.state" object:nil];
  • Теперь мы реализуем метод resetAppState:, где мы снова создаем экземпляр окна приложения и начального контроллера представления. Здесь мы также можем выполнить другие задачи по настройке, если это необходимо.
- (void)resetAppState:(NSNotification*)notification
{
    NSLog(@"Reset app state for UI-Tests");

    // do other reset app state tasks, e.g. clean the caches & the like

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *controller = [storyboard instantiateInitialViewController];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = controller;

    [self.window makeKeyAndVisible];
}

Этот метод, кажется, работает достаточно хорошо. Я смог использовать его, например. делать снимки экрана на разных языках, следовательно, устанавливать язык приложения и сбрасывать состояние приложения из тестового примера.

Я подготовил пример проекта, чтобы проиллюстрировать, как это работает: http://extrabright.com/dl/ResetAppState.zip

person xrb    schedule 06.08.2015
comment
Ссылка битая, можете перезалить пример? - person Sergey; 23.03.2021