Ala*_* P. 4 mocking jsdom reactjs jestjs
我的 React 组件调用window.scrollTo,当我运行我的 jest 测试时,它们通过了,但有一个控制台错误:
console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
Error: Not implemented: window.scrollTo
at Object.<anonymous>.module.exports (/private/var/www/samplesite.com/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
at Window.scrollTo (/private/var/www/samplesite.com/node_modules/jsdom/lib/jsdom/browser/Window.js:544:7)
at scrollTo (/private/var/www/samplesite.com/back-end/utils/library.jsx:180:12)
at commitHookEffectList (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:17283:26)
at commitPassiveHookEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:17307:3)
at Object.invokeGuardedCallbackImpl (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:74:10)
at invokeGuardedCallback (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:256:31)
at commitPassiveEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:18774:9)
at wrapped (/private/var/www/samplesite.com/node_modules/react-dom/node_modules/scheduler/cjs/scheduler-tracing.development.js:207:34)
at flushPassiveEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:18822:5) undefined
Run Code Online (Sandbox Code Playgroud)
我尝试过以几种方式嘲笑它(在测试本身以及setupFiles在每次测试之前调用的玩笑中),但控制台错误不会消失:
尝试 1:
let window = {};
window.scrollTo = jest.fn();
Run Code Online (Sandbox Code Playgroud)
尝试 2:
let scrollTo = jest.fn();
Object.defineProperty(window, "scrollTo", scrollTo);
Run Code Online (Sandbox Code Playgroud)
尝试 3:
delete global.window.scrollTo;
global.window.scrollTo = () => {};
Run Code Online (Sandbox Code Playgroud)
尝试 4:
global.window = {};
global.window.scrollTo = () => {};
Run Code Online (Sandbox Code Playgroud)
我怎样才能摆脱这个控制台错误?谢谢。
对我来说,window.scrollTo在每个测试用例中模拟。或者,将mock 代码放入一个window.setup.js文件中,并将该文件的路径添加到jestsetupFiles配置中,这两种方式都可以正常工作。
例如,
index.spec.tsx:
import React, { Component } from 'react';
class SomeComponent extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick(e) {
e.preventDefault();
window.scrollTo(0, 0);
}
render() {
return (
<div>
<button onClick={this.handleClick}>Click Me!</button>
</div>
);
}
}
export default SomeComponent;
Run Code Online (Sandbox Code Playgroud)
index.spec.tsx,window.scrollTo在每个测试用例中模拟。
import React from 'react';
import { shallow } from 'enzyme';
import SomeComponent from './';
describe('SomeComponent', () => {
test('should handle click', () => {
const wrapper = shallow(<SomeComponent></SomeComponent>);
const mEvent = { preventDefault: jest.fn() };
window.scrollTo = jest.fn();
wrapper.find('button').simulate('click', mEvent);
expect(mEvent.preventDefault).toBeCalled();
expect(window.scrollTo).toBeCalledWith(0, 0);
});
});
Run Code Online (Sandbox Code Playgroud)
jest.config.js:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'enzyme',
// setupFiles: ['/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58585527/window.setup.js'],
setupFilesAfterEnv: ['jest-enzyme'],
testEnvironmentOptions: {
enzymeAdapter: 'react16'
},
coverageReporters: ['json', 'text', 'lcov', 'clover']
};
Run Code Online (Sandbox Code Playgroud)
单元测试结果:
PASS src/stackoverflow/58585527/index.spec.tsx (6.114s)
SomeComponent
? should handle click (12ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 6.947s
Run Code Online (Sandbox Code Playgroud)
或者,创建一个window.setup.js文件并将文件路径放在 jest 中setupFiles:
window.setup.js:
window.scrollTo = jest.fn();
Run Code Online (Sandbox Code Playgroud)
jest.config.js:
window.scrollTo = jest.fn();
Run Code Online (Sandbox Code Playgroud)
单元测试结果:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'enzyme',
setupFiles: ['/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58585527/window.setup.js'],
setupFilesAfterEnv: ['jest-enzyme'],
testEnvironmentOptions: {
enzymeAdapter: 'react16'
},
coverageReporters: ['json', 'text', 'lcov', 'clover']
};
Run Code Online (Sandbox Code Playgroud)
他们两个都工作正常。
源代码:https : //github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58585527
设置 window.scrollTo = jest.fn(); 应该可以工作,如果您想为整个项目定义它而不是单独为每个测试文件定义它,您可以在setupFilesAfterEnv中定义它
或者当使用react-scripts时,你可以在./src/setupTests.js中定义它
| 归档时间: |
|
| 查看次数: |
6843 次 |
| 最近记录: |