2017-04-25 117 views
1

我試圖切換我的反應原生應用程序從使用摩卡/柴到Jest,但我遇到了問題。設置ReactNative的NativeModules.RNDeviceInfo Jest

以前在我test/setup.js我沿着線的東西:

const NativeModules = require('react-native-mock-render').NativeModules; 
const MockRNDeviceInfo = require('./support/mock-device-info.js').MockRNDeviceInfo; 
NativeModules.RNDeviceInfo = MockRNDeviceInfo; 

然而,這並不用開玩笑工作,我得到嘗試測試我的部件之一,當出現以下錯誤:

TypeError: Cannot read property 'appVersion' of undefined 
    at Object.getVersion (node_modules/react-native-device-info/deviceinfo.js:39:20) 

什麼是在NativeModules上設置數值的正確方法?

+0

是否有任何其他代碼可能有助於重現此錯誤? '。/ support/mock-device-info.js'中是什麼? –

回答

2

開玩笑,你可以模擬使用類似的模塊:

jest.mock('react-native-device-info',() => { 
    return { 
    getVersion:() => 4 
    } 
}) 

我只嘲笑getVersion方法,並返回一個隨機數,因爲這是沒有適合你的一個,但你可能要在你的應用程序中添加你正在使用的那個(並將值更改爲你想要的值)。您可以使用jest.fn util來模擬模塊的功能。

+0

我真的認爲'setupFile'的路線長期會更好,而不是在每個測試中嘲笑。看到我的答案。 –

+0

OP已經有一個安裝文件,我不知道你在說什麼。 –

0

我沒有太多經驗反應自己,但我確實有一個朋友。我向他提過這件事,他說你應該重新啓動包裝工。你可以這樣做:首先:

通過退出終端窗口

終止打包然後

手動啓動:

$ react-native start 

我希望這有助於莫名其妙!

-2

下面是使用Jest處理這個問題的最簡單和最快捷的方法。一旦你知道了它真的不是一件麻煩事。

1.創建一個名爲setup.js(或任何你喜歡的)的文件,它將保存你所有的全局模擬。然後在您的package.json文件,你需要包括像這樣

"jest": { 
    "preset": "react-native", 
    "setupFiles": [ 
    "./jest/setup.js" <----- Here's your path to your setup file 
    ] 
} 

您可以在Jest docs here

2.閱讀更多有關setupFiles在該安裝文件,模擬一個這個安裝文件NativeModule這樣的:

jest.mock('NativeModules',() => { 
    return { 
    RNDeviceInfo: { 
     appVersion: 2.1, 
     buildNumber: 12, 
     model: 'iPhone', 
     systemName: 'iOS', 
     systemVersion: '10.3', 
    }, 
    } 
} 

這樣做,將允許玩笑來訪問你的模擬爲react-native-device-info在測試中的每一個。

您還可以根據需要模擬該返回對象中的任何其他NativeModule!希望這可以幫助。