【发布时间】:2017-11-19 16:24:34
【问题描述】:
问题:
我有一个简单的 React 组件,用于学习使用 Jest 和 Enzyme 测试组件。在使用道具时,我添加了prop-types 模块来检查开发中的属性。 prop-types 使用 console.error 在未传递强制 props 或 props 的数据类型错误时发出警报。
我想模拟console.error 来计算prop-types 在我传递缺失/错误类型的道具时调用它的次数。
使用这个简化的示例组件和测试,我希望这两个测试的行为如下:
- 第一个测试需要 0/2 的 props 应该捕获两次模拟调用。
- 具有 1/2 所需道具的第二个测试应该捕获一次调用的模拟。
相反,我得到了这个:
- 第一个测试运行成功。
- 第二次测试失败,抱怨 mock 函数被调用了 0 次。
- 如果我交换测试顺序,第一个有效,第二个失败。
- 如果我将每个测试拆分为一个单独的文件,那么两者都可以。
-
console.error的输出被抑制了,所以很明显它对两者都被嘲笑了。
我确定我遗漏了一些明显的东西,比如清除模拟错误或其他什么。
当我对导出函数的模块使用相同的结构,调用console.error 任意次数时,一切正常。
当我用酶/反应测试时,我在第一次测试后碰到了这堵墙。
示例 App.js:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
export default class App extends Component {
render(){
return(
<div>Hello world.</div>
);
}
};
App.propTypes = {
id : PropTypes.string.isRequired,
data : PropTypes.object.isRequired
};
示例 App.test.js
import React from 'react';
import { mount } from 'enzyme';
import App from './App';
console.error = jest.fn();
beforeEach(() => {
console.error.mockClear();
});
it('component logs two errors when no props are passed', () => {
const wrapper = mount(<App />);
expect(console.error).toHaveBeenCalledTimes(2);
});
it('component logs one error when only id is passed', () => {
const wrapper = mount(<App id="stringofstuff"/>);
expect(console.error).toHaveBeenCalledTimes(1);
});
最后说明: 是的,最好编写组件以在缺少道具时生成一些用户友好的输出,然后对其进行测试。但是一旦我发现了这种行为,我就想弄清楚我做错了什么,以此来提高我的理解力。显然,我错过了一些东西。
【问题讨论】:
标签: javascript reactjs jestjs enzyme