如何在Xcode 7自动化UI测试中访问本地化字符串?

8
我有一个问题,关于本地化字符串的讨论。这是链接: 如何在XCode7上进行自动化UI测试系统按钮? 现在,如果我将iOS系统语言切换到其他语言,我将无法获取本地化字符串,因为它们在不同的包中。我发现另一篇帖子正在讨论此问题。 无法在UI测试(Xcode 7)中访问字符串本地化 如果我复制目标应用程序中的所有本地化字符串到UI测试,则可以正常工作。但是对于那些在XIB或storyboard中使用Object ID表示消息的字符串,这是毫无意义和可读性的。因此,在使用NSLocalizedString之前,必须首先将其转换为信息原始内容。 如何使Object ID可读?
NSLocalizedString("Help", bundle: NSBundle(forClass: AClassInYourUITests.self), comment: "")

有没有一种简单的方法在 Xcode 中解决这个问题?如果可能的话,我不想在我的代码中使用这些无意义的字符串,很难知道它是什么。还是说我必须编写脚本来处理这个问题?

更具体地说,让我们举一个例子。目标应用程序故事板中的某些本地化字符串:

"U2v-M1-HYu.text" = "ヘルプ";
"eTC-Zg-zHl.headerTitle" = "完了";

如果我想为不同的语言进行UI测试,我不能直接将其复制到UI测试包中。我需要首先进行转换,如下所示:

"Help" = "ヘルプ";
"Done" = "完了";

欢迎提出任何建议。

1个回答

1

步骤1。 将您的localizable.strings文件添加到您的UI测试目标中。

步骤2。 在您的测试类中创建这些辅助方法(在此处找到):

var currentLanguage: (langCode: String, localeCode: String)? {
    let currentLocale = Locale(identifier: Locale.preferredLanguages.first!)
    guard let langCode = currentLocale.languageCode else {
        return nil
    }
    var localeCode = langCode
    if let scriptCode = currentLocale.scriptCode {
        localeCode = "\(langCode)-\(scriptCode)"
    } else if let regionCode = currentLocale.regionCode {
        localeCode = "\(langCode)-\(regionCode)"
    }
    return (langCode, localeCode)
}

func localizedString(_ key: String) -> String {
    let testBundle = Bundle(for: /*YourTestClass*/.self)
    if let currentLanguage = currentLanguage,
        let testBundlePath = testBundle.path(forResource: currentLanguage.localeCode, ofType: "lproj") ?? testBundle.path(forResource: currentLanguage.langCode, ofType: "lproj"),
        let localizedBundle = Bundle(path: testBundlePath)
    {
        return NSLocalizedString(key, bundle: localizedBundle, comment: "")
    }
    return "?"
}

第三步。 将第二步中的 YourTestClass 更改为你的测试类

第四步。 使用 localizedString("String") 获取本地化字符串

注意: 这似乎不适用于所有的本地化字符串。我发现这对我来说不适用于故事板字符串,只适用于 localizable.strings 文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接