2016-10-05 2 views
1

Я пытаюсь писать тесты для моего приложения, но я в настоящее время получаю следующее сообщение об ошибке:Дразнящих собственный модуль при тестировании с Jest

● Test suite failed to run 

TypeError: Cannot read property 'language' of undefined 

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

кажется, что ошибка вызвана этой линией в React-Native-Localization, что извлекает локаль устройства:

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

пакет используется в wrapper, который возвращает переведенные строки в компонент, поэтому пакет не вызывается непосредственно. Это выглядит примерно так:

Компонент:

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}`); 
    } 

    // ... 
} 

React-Native-Локализация:

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

class LocalizedStrings { 
    // ... 
} 

Переменная localization устанавливается вне класса и попытка установить переменную как это не работает для меня и возвращает ту же ошибку:

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

    // ... 
}) 

Кто-нибудь знает, как издеваться над этим реактивным модулем?

ответ

0

Поскольку вы тестируете компонент, который зависит от wrapper, вы можете mock в wrapper вместо этого и иметь getString() вернуть некоторые string, которые вы можете использовать в тесте. Таким образом, вы не используете фактический класс wrapper, который зависит от других библиотек.

+0

Вот что я боялся. Я не хотел «издеваться» над «оберткой», так как многие вещи внутри класса «обертка» фактически использовались, то есть у меня было бы много плюсов, чтобы «макет». Спасибо. – Zidail

-1

Попробуйте использовать var localization = require('react-native').NativeModules.I18nManager; вместо

+0

Эта строка исходит из пакета npm, который я использую. Я бы предпочел, чтобы он не раскошелился. [Вот строка из репликации репликации-локально-локализации github.] (Https://github.com/stefalda/ReactNativeLocalization/blob/master/LocalizedStrings.js#L17) – Zidail

+0

Я знаю это, но если вы измените это, уверен, что проблема решена;) – LuisPinto