2017-04-25 222 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!希望这可以帮助。