Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't get access to string localizations in UI Test (Xcode 7)

So I have a situation in which I have a few textFields that are validated. I'm trying to run a UI test, and when they fail they will get an alert to pop up with an error message (potentially a different message depending on what fields are invalid and in what way).

I'd like to test that not only that an alert appeared, but that the correct message is displayed. The problem I'm having is that I need to get the localized text for comparison (if I run tests in another language other than english), but when I call NSLocalizedString in the UITest it can't gather the correct localized string (just returns the key [default])

I've tried adding the localizeable.strings files to the UITest target, but to no avail. Does anyone know if this is possible?

edit as a side note: I also tried setting an accessibility identifier on the UIAlertView but when I query with that accessibility identifier it doesn't exist, I can only query it using the title of the alert which seems backwards.

like image 766
ssrobbi Avatar asked Oct 12 '15 16:10

ssrobbi


2 Answers

In the UI tests, the main bundle seems to be a random launcher app. That's why the .strings file doesn't appear: even though you added it to your test bundle, NSLocalizedString is checking the wrong bundle. To get around this, you need an invocation like this:

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

Which you might want to pull into a helper method.

like image 193
Manuel Avatar answered Oct 16 '22 19:10

Manuel


Here is my solution:

  1. In your UI Tests target -> Build Phases -> Copy Bundle Resources, add the needed localization files (e.g. Localizable.strings).

  2. Add a function similar to the following:

    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 */
    
  3. Use the function like this: app.buttons[localizedString("localized.string.key")]

like image 35
Paradise Avatar answered Oct 16 '22 18:10

Paradise