gpt4 book ai didi

javascript - 加载 React Native : UnhandledPromiseRejectionWarning: Error: Cannot find module 'View'

转载 作者:行者123 更新时间:2023-11-29 15:10:42 27 4
gpt4 key购买 nike

我正在尝试为测试库做贡献。库应该为 react-test-renderer 提供包装器喜欢react-native-testing-library

为了查看我的代码是否有效,我使用我为库编写的代码编写了一个简单的单元测试。由于这是 React Native 的第一次测试,我添加了 react-native作为开发依赖与 metro-react-native-babel-preset 一起.此外,我将预设添加到 babel。

{
"presets": [
[
"env",
{
"targets": {
"browsers": ["last 2 versions", "safari >= 7"]
}
}
],
"react",
"module:metro-react-native-babel-preset"
]
}

库使用 tape 进行断言.

现在,每个测试 ( npm test) 都会抛出错误:

> node -r babel-register -r babel-polyfill source/test
/path/to/node_modules/babel-core/lib/transformation/file/options/option-manager.js:328
throw e;
^

Error: Couldn't find preset "module:metro-react-native-babel-preset" relative to directory

当我从 babel 配置中删除预设时,出现错误:

(node:1841) UnhandledPromiseRejectionWarning: Error: Cannot find module 'View'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
at Function.Module._load (internal/modules/cjs/loader.js:507:25)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
at Object.get View [as View] (/path/to/node_modules/react-native/Libraries/react-native/react-native-implementation.js:165:12)
at _callee7$ (/path/to/source/test.js:110:6)
at tryCatch (/path/to/node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js:65:40)
at Generator.invoke [as _invoke] (/path/to/node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js:303:22)
at Generator.prototype.(anonymous function) [as next] (/path/to/node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js:117:21)
at step (/path/to/source/test.js:27:191)
(node:1841) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3)
(node:1841) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
not ok 10 test exited without ending
---
operator: fail
at: process.<anonymous> (/path/to/node_modules/tape/index.js:90:19)
stack: |-
Error: test exited without ending
at Test.assert [as _assert] (/path/to/node_modules/tape/lib/test.js:226:54)
at Test.bound [as _assert] (/path/to/node_modules/tape/lib/test.js:77:32)
at Test.fail (/path/to/node_modules/tape/lib/test.js:319:10)
at Test.bound [as fail] (/path/to/node_modules/tape/lib/test.js:77:32)
at Test._exit (/path/to/node_modules/tape/lib/test.js:191:14)
at Test.bound (/path/to/node_modules/tape/lib/test.js:77:32)
at process.<anonymous> (/path/to/node_modules/tape/index.js:90:19)
at process.emit (events.js:194:15)

如何让 React Native 组件在库中(以及 expo initreact-native init 项目之外)的测试中运行?

编辑: 我发现该存储库使用的是 Babel 6,这就是 metro 预设似乎不起作用的原因。所以我把它换成了babel-preset-react-native现在我回到了最初的错误 View找不到。

编辑 2: package.json

  "scripts": {
"lint": "eslint source && echo 'Lint complete.'",
"typecheck": "npx -p typescript tsc --rootDir . source/test.js --allowJs --checkJs --noEmit --lib es6 --jsx react && echo 'TypeScript check complete.'",
"ts": "npm run -s typecheck",
"test": "node -r babel-register -r babel-polyfill source/test",
"watch": "watch 'clear && npm run -s test | tap-nirvana && npm run -s lint && npm run -s typecheck' source",
"precommit": "npm run -s test && npm run -s lint && npm run -s typecheck"
},
"devDependencies": {
"@types/node": "10.12.27",
"babel-cli": "6.26.0",
"babel-eslint": "10.0.1",
"babel-preset-env": "1.7.0",
"babel-preset-react": "6.24.1",
"babel-preset-react-native": "4.0.1",
"babel-register": "6.26.0",
"eslint": "5.14.1",
"eslint-plugin-react": "7.12.4",
"react": "16.8.3",
"react-native": "0.58.5",
"tap-nirvana": "1.1.0",
"typescript": "3.3.3333",
"watch": "1.0.2"
},
"dependencies": {
"cheerio": "1.0.0-rc.2",
"esm": "3.2.6",
"react-dom": "16.8.3",
"react-test-renderer": "16.8.3",
"tape": "4.10.1"
}

编辑 3:抱歉,显然我没有包含我的代码,尽管它有助于解决这个问题。这是非常基本的。我只是想渲染 <View />使用 ReactTestRenderer .

import TestRenderer from 'react-test-renderer';
import { Text, View } from 'react-native';
import { describe } from 'riteway';

describe('renderReactNativeComponent', async assert => {
const text = 'Foo';
const component = TestRenderer.create(
<View>
<Text>{text}</Text>
</View>
);
console.log(Text);

assert({
given: 'A React Native component',
should: 'return a working react test renderer instance',
actual: component.findByType('text'),
expected: text
});
});

最佳答案

根据docs , "从 react-native 版本 0.38 开始,在运行 react-native init 时默认包含一个 Jest 设置。"

“react-native 附带 Jest 预设,因此 package.json 的 jest.preset 字段应指向 react-native。预设是模拟 React Native 应用程序环境的节点环境。因为它不加载任何 DOM 或浏览器 API,所以它大大缩短了 Jest 的启动时间。”

重点是 Jest 应该与 React-Native 一起工作,而 riteway 不是。当您运行 react-native init 时,会添加以下依赖项:"jest-react-native"。并在 package.json 中添加了一个 jest 预设:

"jest": {
"preset": "react-native"
}

显然还没有riteway的预设。

关于javascript - 加载 React Native : UnhandledPromiseRejectionWarning: Error: Cannot find module 'View' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com