2016-10-05 6 views
1

Ich versuche Tests für meine Anwendung zu schreiben, aber ich zur Zeit die folgenden Fehlermeldung erhalten:Mocking Eine Native Module, wenn sie mit Jest Testen

● Test suite failed to run 

TypeError: Cannot read property 'language' of undefined 

    at Object.<anonymous> (node_modules/react-native-localization/LocalizedStrings.js:17:35) 

Es scheint, dass der Fehler durch diese Linie in React-Native-Localization verursacht wird, ruft das Gebietsschema des Gerätes:

var localization = require('react-native').NativeModules.ReactLocalization; 
var interfaceLanguage = localization.language.replace(/_/g,'-'); 

das Paket in einem wrapper, die übersetzten Strings auf die Komponente zurück, so dass das Paket genannt wird, nicht direkt verwendet wird. Es sieht etwa so aus:

Komponente:

import wrapper from '../wrapper' 

class component extends Component { 
    render() { 
    return(
     <Text>{wrapper.getString(key)}</Text> 
    ); 
    }  

    // ... 
} 

Wrapper:

import LocalizedStrings from 'react-native-localization' 

class wrapper { 

    constructor() { 
    this.translations = new LocalizedStrings(...); 
    } 

    getString(key) { 
    return eval(`this.translations.${key}`); 
    } 

    // ... 
} 

Reagieren Native-Lokalisierung:

var localization = require('react-native').NativeModules.ReactLocalization; 
var interfaceLanguage = localization.language.replace(/_/g,'-'); 

class LocalizedStrings { 
    // ... 
} 

Die localization Variable außerhalb der Klasse gesetzt und zu versuchen, die Variable so einzustellen, funktioniert bei mir nicht und gibt denselben Fehler zurück:

jest.mock('react-native-localization',() => { 
    // This doesn't work 
    const localization = { language: "en-US" } 

    // This doesn't work either, because it hits the var initialization 
    const rnl = require.requireActual('react-native-localization') 
    rnl.localization = { language: "en-US" } 

    // ... 
}) 

Wer weiß, wie das einheimische Modul reagieren zu verspotten?

Antwort

0

Da Sie die Komponente testen, die auf wrapper abhängig ist, können Sie die wrapper statt und haben mock die getString() einige string zurückzukehren, die Sie in Ihrem Test verwenden können. Auf diese Weise verwenden Sie nicht die tatsächliche Klasse wrapper, die von anderen Bibliotheken abhängt.

+0

Das ist, was ich hatte Angst vor. Ich wollte den "Wrapper" nicht "vortäuschen", da viele der Dinge in der "Wrapper" -Klasse tatsächlich verwendet werden, was bedeutet, dass ich auch viele gute Sachen zum "Mock" haben würde. Vielen Dank. – Zidail

-1

Versuchen Sie mit var localization = require('react-native').NativeModules.I18nManager; statt

+0

Diese Zeile stammt von einem npm-Paket, das ich verwende. Ich würde es am liebsten vermeiden, dass ich es abzweigen muss. [Hier ist die Zeile von der React-Native-Lokalisierung github Repo.] (Https://github.com/stefalda/ReactNativeLocalization/blob/master/LocalizedStrings.js#L17) – Zidail

+0

Ich weiß es, aber wenn Sie das ändern ' bin sicher das Problem ist gelöst;) – LuisPinto

Verwandte Themen