React Native的testing section个文档表明Jest是进行单元测试的官方方式.然而,他们没有解释如何设置.在没有任何设置的情况下运行Jest会产生语法错误(没有行号:()),因为它没有应用本机代码通常使用的转换(例如ES6功能、JSX和流).React原生源代码try中有一个jestSupport
文件夹,其中包含env.js
和scriptPrerocess.js
,后者包含应用转换的代码.因此,我将这些内容复制到我的项目中,并将以下部分添加到我的包中.json:
"jest": {
"scriptPreprocessor": "jestSupport/scriptPreprocess.js",
"setupEnvScriptFile": "jestSupport/env.js"
},
这修复了第一个错误,但仍然出现以下错误:
Using Jest CLI v0.4.0
FAIL js/sync/__tests__/SynchronisedStorage-tests.js
SyntaxError: /Users/tom/my-project/js/sync/__tests__/SynchronisedStorage-tests.js: /Users/tom/my-project/js/sync/SynchronisedStorage.js: /Users/tom/my-project/node_modules/react-native/Libraries/react-native/react-native.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/browser/ui/React.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/utils/ReactChildren.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/addons/ReactFragment.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/classic/element/ReactElement.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/core/ReactContext.js: /Users/tom/my-project/node_modules/react-native/node_modules/react-tools/src/vendor/core/warning.js: Unexpected token .
1 test failed, 0 tests passed (1 total)
Run time: 0.456s
我还需要做更多的事情来让jest变得更自然吗?有没有Jest设置的例子来测试React Native?
EDIT:
有一个签入scriptPreprocess
阻止它在node_modules
中的任何文件上运行,其中当然包括整个React Native.删除它修复了上述错误.然而,我现在从React原生源代码中得到了更多错误,这显然似乎不是为了Jest .
EDIT2:
明确设置react-native
模块的模拟功能:
jest.setMock('react-native', {});
这似乎是非常手动的,对于测试经常与React原生API交互的代码来说不是很有用.我肯定还是觉得我错过了什么!