首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在0.57更新:无法找到预置模块:metro- React本机-babel-预设“”相对于目录

在0.57更新:无法找到预置模块:metro- React本机-babel-预设“”相对于目录
EN

Stack Overflow用户
提问于 2018-09-15 10:06:03
回答 3查看 7.2K关注 0票数 17

如果在新的React版本0.57和TypeScript中将测试与Jest和酶集成,它们将无法工作。以下是复制的步骤:

创建一个新的React本机项目:

代码语言:javascript
复制
react-native init MyApp -package "com.my.app" --template typescript && node MyApp/setup.js

安装所有与Jest和Enzyne相关的软件包:

代码语言:javascript
复制
npm install --save-dev react-dom enzyme enzyme-react-adapter-16 jest-fetch-mock ts-jest

添加jest配置:

代码语言:javascript
复制
"jest": {
  "preset": "react-native",
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js"
  ],
  "transform": {
    "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest",
    "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
  },
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
  "testPathIgnorePatterns": [
    "\\.snap$",
    "<rootDir>/node_modules/"
  ],
  "cacheDirectory": ".jest/cache",
  "setupFiles": [
    "./tests/setup.js"
  ]
}

添加一个文件tests/setup.js并包括以下配置:

代码语言:javascript
复制
import Enzyme from "enzyme";
import Adapter from "enzyme-adapter-react-16";
import { NativeModules } from "react-native";

global.fetch = require("jest-fetch-mock"); // eslint-disable-line no-undef
jest.mock("react-native-config");
Enzyme.configure({ adapter: new Adapter() });

最后但并非最不重要的是添加一个基本测试(App.test.tsx)来检查Jest和酶是否有效:

代码语言:javascript
复制
import React from "react";
import { shallow } from "enzyme";
import { View } from "react-native";
import App from "./App";

const createTestProps = props => ({
  ...props
});

describe("App", () => {
  describe("rendering", () => {
    let wrapper;
    let props;
    beforeEach(() => {
      props = createTestProps({});
      wrapper = shallow(<App {...props} />);
    });

    it("should render a <View />", () => {
      expect(wrapper.find(View)).toHaveLength(1);
    });
  });
});

如果您现在尝试运行测试,您得到的错误消息是:

代码语言:javascript
复制
 FAIL  app/App.test.tsx
  ● Test suite failed to run

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

编辑

这似乎和Babel有关。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-17 12:08:28

我在这个问题上找到了答案:https://github.com/facebook/metro/issues/242#issuecomment-421139247

基本上,将其添加到package.json中的Jest部分

代码语言:javascript
复制
"transform": { "^.+\\.js$": "<rootDir>/node_modules/react-native/jest/preprocessor.js" }
票数 24
EN

Stack Overflow用户

发布于 2018-09-15 18:42:41

升级到0.57时,我的package.json也有类似的问题,我的babel-preset-react-native仍然包含一个条目(现在已经不再支持metro-react-native-babel-preset了)。我所要做的就是

yarn remove babel-preset-react-native

然后

yarn add metro-react-native-babel-preset --dev

最后,确保将.babelrc更改为

代码语言:javascript
复制
{
  "presets": ["react-native"]
}

代码语言:javascript
复制
{
  "presets": ["module:metro-react-native-babel-preset"]
}

更多信息可以找到这里

票数 6
EN

Stack Overflow用户

发布于 2019-02-12 20:41:49

如果我使用"presets": ["react-native"],那么生产/开发就会中断,但是测试是有效的。

如果我使用"presets": ["module:metro-react-native-babel-preset"],那么测试就会中断,但是生产/开发是有效的。

不知道为什么会这样,但对于我来说,像下面这样的.babelrc解决方案对开发/生产和测试都有效。只需将env参数添加到.babelrc文件中即可。

代码语言:javascript
复制
"env": {
    "test": {
        "presets": ["react-native"]
    },
    "production": {
        "presets": ["module:metro-react-native-babel-preset"]
    },
    "development": {
        "presets": ["module:metro-react-native-babel-preset"]
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52343699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档