Приложение не удалось приостановить в проекте 60sin React-Native

Итак, я пытаюсь запустить тест пользовательского интерфейса XCode в своем проекте React Native. Моя цель — использовать fastlane/snapshot для захвата скриншотов моего приложения.

Наконец-то я понял, как написать скрипт для своего приложения, чтобы оно делало то, что я хочу. К сожалению, приложение зависает с сообщением App failed to quiesce within 60s после вызова app.otherElements["mainButton"].tap().

Насколько я могу судить как человек, мое приложение кажется статичным и ничего не обновляет и не анимирует. Но мне не ясно, что тест пользовательского интерфейса использует для своей эвристики обнаружения, поэтому он может использовать какое-то внутреннее состояние или проверять потоки.

Я подозреваю, что есть какое-то поведение React Native, которое мешает тесту пользовательского интерфейса видеть все как завершенное. К сожалению, без реальной возможности увидеть, что делают тесты пользовательского интерфейса, я даже не уверен, где мне нужно копаться в React Native, чтобы это исправить. :(

Любая помощь будет оценена по достоинству!


person Mike Lambert    schedule 05.08.2016    source источник
comment
openradar.me/25562105 forums.developer.apple.com/thread/6503   -  person Che    schedule 17.08.2016


Ответы (1)


Обходной путь по ссылке выше. Для представления с проблемами и строкой для отключения анимации в

viewWillAppear:
- (void) viewWillAppear: (BOOL)animated {  
    if ([[[NSProcessInfo processInfo] environment][@"UITEST_DISABLE_ANIMATIONS"] isEqualToString:@"YES"]) {  
        [UIView setAnimationsEnabled:NO];  
    }  
}  

и в viewWillDisappear снова включите анимацию:

- (void) viewWillDisappear:(BOOL)animated {  
    if ([[[NSProcessInfo processInfo] environment][@"UITEST_DISABLE_ANIMATIONS"] isEqualToString:@"YES"]) {  
        [UIView setAnimationsEnabled:YES];  
    }  
}  

В ваших тестах расширьте XCUIApplication и задайте переменные. Затем в вашем методе настройки вызовите эту функцию запуска переменных

extension XCUIApplication {  
    func launchTestsWithEnvironmentVariables() {  
             launchEnvironment = [  
                 "UITEST_DISABLE_ANIMATIONS" : "YES"  
             ]  
     self.launch()  
    }  
}  




 override func setUp() {  
        super.setUp()  
        continueAfterFailure = false  
        XCUIApplication().launchTestsWithEnvironmentVariables()  
    }  




func testblahblah {  

Это устанавливает переменную среды, которая отключает анимацию для этого конкретного представления. Единственным недостатком является то, что вы не будете тестировать анимацию для этого представления, если вам это нравится. Хакерский обходной путь, но пока он работает.

P.S. мне очень помогло

person Che    schedule 04.09.2016
comment
Потрясающе, большое спасибо! У меня не было подкласса UIViewController, чтобы вставить их (поскольку я использую запас UIViewController в AppDelegate.m). Однако я вставил код отключения в didFinishLaunchingWithOptions моего AppDelegate, который хорошо сработал для меня. (Отключил их на время работы приложения, так как у меня не было причин повторно включать их для других представлений) - person Mike Lambert; 13.09.2016