在iOS单元和UItesting中忽略了Scheme语言设置

我的最终目标是发行

xcodebuild test 

从命令行为不同的语言select不同的scheme。

目前我有两种scheme,唯一的区别就是应用语言。 在一个计划中是英文,另一个是西class牙文。 如果我使用xCode来运行应用程序,它的工作很好,它使用我select的scheme中指定的语言启动,EN或ES都可以。

如果我从xCode运行testing,语言设置将被忽略。 无论select哪种scheme,都无关紧要,它始终显示为设备语言。 模拟器上也一样。 使用xcodebuildtesting挑选scheme运行testing时也是如此。 (向scheme添加回显命令可确保选取正确的回显命令)

在scheme编辑器中选中“使用运行动作的参数和环境variables”。

我究竟做错了什么?

谢谢。

是的,似乎在XCTesttesting中忽略了在scheme中提供的所有环境variables和启动参数。

但是,您可以在testing中以编程方式设置语言,例如在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命令行工具:

  • 设备types通过xcodebuild参数的目标parameter passing

  • 在运行testing之前,语言通过快照写入的临时文件传递,并在启动应用程序时由UItesting读取

最后,为了更改模式库上的语言,您可以执行以下操作:

1.编写一个用于创build临时文件的Test的预执行脚本:

 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将使用该scheme的预执行脚本中指定的语言/区域设置运行testing。

UPDATE

事实certificate,testing不会忽略该scheme中提供的参数。 参数实际上传递给testing本身,但不传递给testing的应用程序。 这可能是意想不到的,但这是有道理的。

这就是说,所有你需要做到这一点:

1.设置-AppleLanguages (en-US)-AppleLocale en_US为scheme中的testing启动参数

屏幕截图 - 为方案中的测试设置<code> -AppleLanguages(en)</ code>和<code> -AppleLocale“en_US”</ code>启动参数

2.在调用launch()方法之前,将testing中的启动parameter passing给XCUIApplication实例

 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() }