Загрузка React Native: UnhandledPromiseRejectionWarning: Ошибка: не удается найти модуль 'View'
Я пытаюсь внести свой вклад в библиотеку тестирования. Библиотека должна предоставлять оболочку для рендеринга реагирования на тесты, как это делает библиотека реагирования на тестирование.
Чтобы увидеть, работает ли мой код, я написал простой модульный тест, используя код, написанный для библиотеки. Так как это был первый тест на 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"
]
}
Библиотека делает свои утверждения, используя ленту.
Теперь каждый тест (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 init
или же react-native init
проект?
РЕДАКТИРОВАТЬ: Я узнал, что репо использует Babel 6, поэтому предустановка метро, кажется, не работает. Я обменял его на 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"
}
0 ответов
Удалить узлы модулей и установить снова
rm -rf node_modules
npm install
Согласно документации, "Начиная с версии 0.38 реактивной версии, настройка Jest включена по умолчанию при запуске init-собственной реакции".,
А также
"act-native поставляется с предустановкой Jest, поэтому поле jest.preset вашего package.json должно указывать на response-native. Предустановка - это среда узла, которая имитирует среду приложения React Native. Поскольку оно не загружается любой DOM или API браузера, это значительно улучшает время запуска Jest."
Дело в том, что Jest должен работать с React-Native, и riteway
нет. Когда ты бежишь react-native init
добавлена следующая зависимость: "jest-react-native"
, И шутка пресет добавлен в package.json
:
"jest": {
"preset": "react-native"
}
По-видимому, пока нет предустановок для ритуала.
Возможно, вы захотите просто использовать предложенный пример в https://reactjs.org/docs/test-renderer.html чтобы убедиться, что в написанном вами коде нет ничего плохого, а затем добавить свою собственную логику для ее улучшения (просто идея отладить его). Может быть, добавить его в https://snack.expo.io/? или github, я помогу тебе отладить.