在我的应用程序中,我NSLocalizedString用于本地化我的应用程序。现在,我想切换到UITests这样的Habe Testcode:
NSLocalizedString
UITests
[tabBarsQuery.buttons["particiants"] tap];
这适用于英语,但不适用于其他语言。
[tabBarsQuery.buttons[NSLocalizedString("PARTICIPANTS",comment:nil)] tap];
失败-可能是因为Localizable.strings在另一个捆绑包中。如何测试本地化的应用程序?
我想实际测试UI功能的内容,而不仅仅是它们的存在,因此设置默认语言或使用可访问性标识符不适合。
这基于Volodymyr和matsoftware的答案。但是,他们的答案取决于deviceLanguage需要在中明确设置的答案SnapshotHelper。该解决方案动态获取设备使用的实际支持语言。
deviceLanguage
SnapshotHelper
Localizable.strings
将以下代码添加到您的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 “?” }
通过访问方法 localizedString(key)
localizedString(key)
对于带有脚本代码的语言,localeCode将为langCode-scriptCode(例如zh-Hans)。否则,localeCode将为langCode-regionCode(例如pt-BR)。第testBundle一种尝试通过解析lproj localeCode,然后回退到just langCode。
localeCode
langCode-scriptCode
zh-Hans
langCode-regionCode
pt-BR
testBundle
langCode
如果仍然无法获取捆绑包,则返回“?” 字符串,因此它将失败任何寻找特定字符串的UI测试。