Настройки языка схемы игнорируются в модуле iOS и тестах ui

Моя конечная цель - выпустить

xcodebuild test

из командной строки, выбирающей разные схемы для разных языков.

В настоящее время у меня есть две схемы, единственная разница между ними - это язык приложения. В одной схеме это английский, в другом - испанский. Если я использую xCode для запуска приложения, он работает хорошо, он запускается с языком, указанным в выбранной мной схеме, как EN, так и ES в порядке.

Если я запускаю тесты из xCode, установка языка игнорируется. Какую бы схему я ни выбрал, это не имеет значения, она всегда отображается как язык устройства. То же самое на симуляторе. То же самое при выполнении тестов с   Тест xcodebuild схема комплектования. (Добавление команды эха в схему гарантирует, что будет выбран правильный)

В редакторе схемы проверяется флажок "Использовать аргументы" Действие "и переменные среды".

Что я делаю неправильно?

Спасибо.

Ответ 1

Да, похоже, что все переменные среды и аргументы запуска, представленные в схемах, игнорируются в тестах XCTest.

Однако вы можете установить язык программно в тесте, например, в методе setUp():

override func setUp() {
    super.setUp()

    // Put setup code here. This method is called before the invocation of each test method in the class.

    let app = XCUIApplication()
    app.launchArguments += ["-AppleLanguages", "(en-US)"]
    app.launchArguments += ["-AppleLocale", "\"en-US\""]

    app.launch()

}

Теперь вы можете расширить этот подход и сделать что-то вроде Snapshot:

2 вещь должна быть передана из моментального снимка в команду xcodebuild инструмент:

  • Тип устройства передается через параметр назначения параметр xcodebuild

  • Язык передается через временный файл, который записывается моментальным снимком перед запуском тестов и считывается пользовательским интерфейсом Тесты при запуске приложения

В конце концов, чтобы изменить язык на базах схем, вы можете сделать следующее:

1. Напишите предварительное действие script для теста, которое создает временный файл:

mkdir -p ~/Library/Caches/xcode-helper
echo "en-US" > ~/Library/Caches/xcode-helper/language.txt

2. Загрузите файл в setUp() и установите язык приложения:

override func setUp() {
    super.setUp()

    let app = XCUIApplication()

    let path = NSProcessInfo().environment["SIMULATOR_HOST_HOME"]! as NSString
    let filepath = path.stringByAppendingPathComponent("Library/Caches/xcode-helper/language.txt")


    let trimCharacterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet()
    let language = try! NSString(contentsOfFile: filepath, encoding: NSUTF8StringEncoding).stringByTrimmingCharactersInSet(trimCharacterSet) as String

    app.launchArguments += ["-AppleLanguages", "(\(language))"]
    app.launchArguments += ["-AppleLocale", "\"\(language)\""]

    app.launch()
}

С этого момента Xcode будет запускать тест с языком/языком, указанным в схеме pre-action script.

UPDATE

Выключается, тесты не игнорируют аргументы, приведенные в схеме. Аргументы фактически передаются самому тесту, но не тестируемому. Что может быть неожиданным, но это имеет смысл.

Это, как говорится, все, что вам нужно сделать:

1. Задайте аргументы запуска -AppleLanguages (en-US) и -AppleLocale en_US для теста в схеме

Снимок экрана - Установить < код > -AppleLanguages ​​(en) </code> и <code> -AppleLocale ", en_US

2. Передайте аргументы запуска в тесте экземпляру XCUIApplication перед вызовом метода launch()

override func setUp() {
    super.setUp()

    // Put setup code here. This method is called before the invocation of each test method in the class.

    let app = XCUIApplication()
    app.launchArguments += NSProcessInfo().arguments
    app.launch()
}