小编典典

具有本地化UI的Xcode 7 UITests

swift

在我的应用程序中,我NSLocalizedString用于本地化我的应用程序。现在,我想切换到UITests这样的Habe Testcode:

[tabBarsQuery.buttons["particiants"] tap];

这适用于英语,但不适用于其他语言。

[tabBarsQuery.buttons[NSLocalizedString("PARTICIPANTS",comment:nil)] tap];

失败-可能是因为Localizable.strings在另一个捆绑包中。如何测试本地化的应用程序?


阅读 273

收藏
2020-07-07

共1个答案

小编典典

我想实际测试UI功能的内容,而不仅仅是它们的存在,因此设置默认语言或使用可访问性标识符不适合。

这基于Volodymyr和matsoftware的答案。但是,他们的答案取决于deviceLanguage需要在中明确设置的答案SnapshotHelper。该解决方案动态获取设备使用的实际支持语言。

  1. Localizable.strings文件添加到您的UITest目标。
  2. 将以下代码添加到您的UITest目标:

    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: / a class in your test bundle /.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 “?”
    }

  3. 通过访问方法 localizedString(key)

对于带有脚本代码的语言,localeCode将为langCode-scriptCode(例如zh-Hans)。否则,localeCode将为langCode-regionCode(例如pt-BR)。第testBundle一种尝试通过解析lproj localeCode,然后回退到just langCode

如果仍然无法获取捆绑包,则返回“?” 字符串,因此它将失败任何寻找特定字符串的UI测试。

2020-07-07