ios 无法访问UI测试中的字符串本地化(Xcode 7)

gwbalxhn  于 2023-01-22  发布在  iOS
关注(0)|答案(3)|浏览(132)

我遇到了这样一种情况,我有一些文本字段需要验证,我正在尝试运行一个UI测试,当它们失败时,它们会得到一个警报,并弹出一条错误消息(可能是不同的消息,取决于哪些字段是无效的,以及以什么方式无效)。
我想测试的不仅是警报是否出现,而且消息是否显示正确。我遇到的问题是,我需要获取本地化文本进行比较(如果我用英语以外的其他语言运行测试),但当我在UITest中调用NSLocalizedString时,它无法收集正确的本地化字符串(只返回键[default])
我试过将localizeable.strings文件添加到UITest目标,但是没有用。有人知道这是否可行吗?

**作为旁注编辑:**我还尝试在UIAlertView上设置一个可访问性标识符,但当我使用该可访问性标识符查询时,它不存在,我只能使用警报的标题来查询它,这看起来是反向的。

nbysray5

nbysray51#

在UI测试中,主捆绑包似乎是一个随机启动应用,这就是为什么.strings文件没有出现的原因:即使您将其添加到测试包中,NSLocalizedString仍在检查错误的包。要解决此问题,您需要像这样的调用:

NSLocalizedString("LOCALIZATION_KEY", bundle: NSBundle(forClass: AClassInYourUITests.self), comment: "")

您可能希望将其拉入帮助器方法中。

hgncfbus

hgncfbus2#

下面是我的解决方案:
1.在UI测试目标-〉构建阶段-〉复制捆绑包资源中,添加所需的本地化文件(例如Localizable. string)。
1.添加类似于以下内容的函数:

func localizedString(key:String) -> String {
    /*1*/ let localizationBundle = NSBundle(path: NSBundle(forClass: /*2 UITestsClass*/.self).pathForResource(deviceLanguage, ofType: "lproj")!) 
    /*3*/ let result = NSLocalizedString(key, bundle:localizationBundle!, comment: "") // 
    return result
}

/*1 Gets correct bundle for the localization file, see here: http://stackoverflow.com/questions/33086266/cant-get-access-to-string-localizations-in-ui-test-xcode-7 */
/*2 Replace this with a class from your UI Tests*/ 
/*3 Gets the localized string from the bundle */

1.按如下方式使用函数:app.buttons[localizedString("localized.string.key")]

70gysomp

70gysomp3#

我在这里写了另一种方法:https://stackoverflow.com/a/75178860/7715250.删除/关闭问题时的复制粘贴:

不调用String上的方法的不同方法

    • 先决条件**

您正在使用NSLocalizedString

    • 步骤1**

确保将翻译添加到测试目标(转到Localizable文件,在右侧点击UI测试目标)。

    • 第二步**

把这个加到你主要目标的某个地方

#if DEBUG
    // Can be changed by UI tests to get access to localized content
    var bundleForLocalizedTexts = Bundle.main
#else
    let bundleForLocalizedTexts = Bundle.main
#endif
    • 步骤3**

将此值添加到所有NSLocalizedString中的参数bundle,如下所示:

NSLocalizedString(
    "localized",
    bundle: bundleForLocalizedTexts,
    comment: ""
)
    • 步骤4**

覆盖XCTestCase子类中的setUp方法并添加以下行:
bundleForLocalizedTexts = Bundle(for: MySubclass.self)

    • 第五步**

所有的语言都应该工作,没有额外的方法调用。

相关问题