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

Доступ к коду приложения-хозяина из целевой тестовой программы UI Xcode 7

Я разрабатываю проект iOS, и мне нужно получить доступ к кодам хост-приложения из целевого объекта пользовательского интерфейса, но я обнаружил, что он показывает ошибку ссылки: undefined символ, когда я пытался. Я обнаружил, что тестовый хост и загрузчик пакетов для этой цели пустые, поэтому я установил их в мое приложение-хост и смог пройти мимо ошибки связи. Однако во время выполнения он все еще не работает при вызове XCUIApplication.launch(). Кто-нибудь понял, как получить доступ к кодам хост-приложения из этой целевой тестовой программы? Не имея возможности сделать это, мы вынуждены делать все тесты UI, которые очень шелушатся. Нам определенно нужно иметь не-пользовательский интерфейс в сценариях тестирования. Я использую Swift для моего проекта.

4b9b3361

Ответ 1

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

Задайте аргументы в тесте пользовательского интерфейса

let app = XCUIApplication()
app.launchArguments = ["ResetDefaults", "NoAnimations", "UserHasRegistered"]
app.launch()

Чтение аргументов в приложении

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    var arguments = NSProcessInfo.processInfo().arguments
    arguments.removeFirst()
    print("App launching with the following arguments: \(arguments)")

    // Always clear the defaults first
    if arguments.contains("ResetDefaults") {
      destroyUserDefaults()
      clearKeychain()
    }

    for argument in arguments {
      switch argument {
      case "NoAnimations":
        UIView.setAnimationsEnabled(false)
      case "UserHasRegistered":
        Defaults.userRegistered = true
      default:
        break
    }
  }
}

Дополнительный бонус: если вы используете параметры запуска для настройки своего приложения, тривиально добавлять флаги в схему Xcode. Например, у меня есть схема, которая очищает все сохраненные данные и блокирует любую попытку входа с успешным ответом. Теперь я могу "войти" через симулятор, не нажимая ни на какие серверы.

Ответ 2

Используя новую инфраструктуру автоматизации пользовательского интерфейса Apple, представленную в WWDC 15, невозможно получить доступ к вашему коду приложения из теста UI-Automation. Это означало, чтобы имитировать то, к чему у пользователя будет доступ, который иногда может быть разочаровывающим.