2015-12-04 11 views
7

Ho un'altra domanda basata sul thread di discussione precedente di stringhe localizzate. Ecco il link: How to do automated UI testing for system button on XCode7?Come accedere alla stringa localizzata durante il test dell'interfaccia utente automatizzato in Xcode 7?

Ora, se si passa la lingua del sistema iOS a un altro, non riesco a ottenere la stringa localizzata poiché è in bundle diverso. Ho trovato un altro thread sta parlando di questo: Can't get access to string localizations in UI Test (Xcode 7)

Funziona bene se copio tutte le stringhe localizzate dall'app di destinazione ai test dell'interfaccia utente. Ma per quelle stringhe in XIB o in storyboard stanno usando Object ID per rappresentare un messaggio, è privo di significato e non è leggibile. How to make Object ID human-readable?

Quindi devo convertirlo primo a sapere di cosa si tratta in origine prima di utilizzare NSLocalizedString:

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

C'è un modo semplice per risolvere questo problema all'interno di Xcode? Se possibile, non vorrei usare questa stringa senza senso nel mio codice, è difficile sapere di cosa si tratta. O devo scrivere uno script per gestirlo?

Per essere più precisi, facciamo un esempio. Alcuni dei miei stringhe localizzate in storyboard di applicazione di destinazione sono:

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

Se voglio fare i test dell'interfaccia utente per lingue diverse, non posso copiarlo il fascio di test dell'interfaccia utente. Ho bisogno di convertirlo prima in questo modo:

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

Qualsiasi suggerimento è benvenuto.

risposta

0

Fase 1. aggiungere il file localizable.strings per l'interfaccia utente di destinazione di prova

Fase 2. creare questi metodi helper nella classe di test (che si trova here):

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 "?" 
} 

Fase 3 Modificare YourTestClass nel codice passaggio 2 nella classe di test

Fase 4. Ottenere la stringa localizzata utilizzando localizedString("String")

NOTA: Questo non sembra funzionare per tutte le stringhe di localizzazione. Ho trovato che non funziona per le stringhe storyboard per me, solo il file localizable.strings.