javascript - 在构造函数中使用 Enzyme 进行 React Native 的 Jest 抛出丢失的 super() 调用
问题描述
在完成所有设置和工作时遇到一些麻烦,这是我的环境
Environment:
OS: macOS 10.14.2
Node: 8.9.0
Yarn: 1.5.1
npm: 6.4.1
Watchman: 4.9.0
Xcode: Xcode 10.1 Build version 10B61
Android Studio: 3.2 AI-181.5540.7.32.5056338
Packages: (wanted => installed)
react: 16.3.1 => 16.3.1
react-native: 0.55.4 => 0.55.4
这是jest
我的配置package.json
"jest": {
"preset": "react-native",
"transformIgnorePatterns": [
"node_modules/(?!react-native|react-navigation)/"
],
"coverageThreshold": {
"global": {
"statements": 80
}
},
"moduleFileExtensions": [
"js",
"jsx"
],
"moduleDirectories": [
"node_modules"
],
"snapshotSerializers": ["enzyme-to-json/serializer"],
"setupTestFrameworkScriptFile": "./setup-tests.js",
"setupFiles": ["./setup.js"]
}
在setup-tests.js
文件中我有这个设置
import 'react-native';
import 'jest-enzyme';
import Adapter from 'enzyme-adapter-react-16';
import Enzyme from 'enzyme';
/**
* Set up DOM in node.js environment for Enzyme to mount to
*/
const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');
const { window } = jsdom;
function copyProps(src, target) {
Object.defineProperties(target, {
...Object.getOwnPropertyDescriptors(src),
...Object.getOwnPropertyDescriptors(target),
});
}
global.window = window;
global.document = window.document;
global.navigator = {
userAgent: 'node.js',
};
copyProps(window, global);
/**
* Set up Enzyme to mount to DOM, simulate events,
* and inspect the DOM in tests.
*/
Enzyme.configure({ adapter: new Adapter() });
/**
* Ignore some expected warnings
* see: https://jestjs.io/docs/en/tutorial-react.html#snapshot-testing-with-mocks-enzyme-and-react-16
* see https://github.com/Root-App/react-native-mock-render/issues/6
*/
const originalConsoleError = console.error;
console.error = (message) => {
if (message.startsWith('Warning:')) {
return;
}
originalConsoleError(message);
};
和setup.js
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({ adapter: new Adapter() });
我从酶网站上的这个页面得到的
https://airbnb.io/enzyme/docs/guides/react-native.html
依赖版本是
"babel-core": "^6.26.3",
"babel-jest": "23.6.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react-native": "4.0.1",
"enzyme": "^3.8.0",
"enzyme-adapter-react-16": "^1.7.1",
"enzyme-to-json": "^3.3.5",
"jest": "23.6.0",
"jest-enzyme": "^7.0.1",
"jest-serializer-enzyme": "^1.0.0",
"jsdom": "^13.2.0",
"react-addons-test-utils": "^15.6.2",
"react-dom": "^16.7.0",
"react-native-mock-render": "^0.1.2",
"react-test-renderer": "16.3.1"
我得到的具体错误是
***/node_modules/jsdom/lib/jsdom/living/generated/Element.js: missing super() call in constructor
15 |
16 | class Element extends Node.interface {
> 17 | constructor() {
| ^
18 | throw new TypeError("Illegal constructor");
19 | }
20 |
我为此尝试了许多不同的配置,但似乎无法克服这个错误。
这是测试文件
import 'react-native';
import React from 'react';
import {Login} from './index';
import { mount } from 'enzyme';
it('renders correctly', () => {
const wrapper = mount(
<Login />
);
expect(wrapper).toMatchSnapshot();
});
我已经配对了我实际测试的文件,以尝试删除任何可能的外部库问题
import React from 'react';
import {
View,
Text
} from 'react-native';
export class Login extends React.Component {
render() {
return (
<View>
<Text>Hello World</Text>
</View>
);
}
}
export default Login;
这里的命名导出和默认导出没有区别,但通常默认导出连接到 redux,所以我导出命名类进行测试。
解决方案
推荐阅读
- javascript - 在 Javascript 中有效地逐步过滤大型数据集
- reactjs - 视频源不会在 useState() 上更新
- .net - 是否可以将测试项目添加到针对 .NET 5.0 的 WPF 解决方案?
- iterm2 - iTerm2 - 选择窗口时选择窗格
- javascript - Google 表格:复制单元格并在另一个选项卡中对其进行排序
- c++ - 如何将结构放置到 std::unordered_map 中?
- android - Android highcharts 显示单条目条形图
- spring-boot - 使用 JWTTokenValidator 验证 Okta 令牌时遇到问题
- r - ggalluvial geom_text 重复
- python - 如何使用 Discord 机器人(Python)更改我的个人资料图片?