我正在传递一个方法,该方法将父级的状态更改为子级(我知道,Redux 在这方面做得更好,但这仅用于测试)。
这是我的子组件:
import React, {Component} from 'react';
import PropTypes from 'prop-types';
class RemoveTaskBtn extends Component {
render() {
const {removeTask, task} = this.props;
return (
<button
onClick={() => removeTask(task)}
>
Remove
</button>
);
}
}
RemoveTaskBtn.propTypes = {
task: PropTypes.object.isRequired,
};
export default RemoveTaskBtn;
这是我的测试:
import React from 'react';
import ReactDOM from 'react-dom';
import Remove_task_btn from './Remove_task_btn';
import {shallow} from 'enzyme';
import {configure} from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({adapter: new Adapter()});
describe('<RemoveTaskBtn/>', function () {
let wrapper;
beforeEach(() => {
wrapper = shallow(
<Remove_task_btn
removeTask={() => {
}}
task={{text: 'test'}}
/>
);
})
it('should call removeTask onClick',
function () {
wrapper
.find('button')
.simulate('click');
console.log(wrapper.props())
expect(wrapper.props().onClick)
.toHaveBeenCalledTimes(1)
});
})
但它现在不起作用。
我收到此错误:
● <RemoveTaskBtn/> › should call removeTask onClick
expect(jest.fn())[.not].toHaveBeenCalledTimes()
Matcher error: received value must be a mock or spy function
Received has type: function
Received has value: [Function onClick]
26 | console.log(wrapper.props())
27 | expect(wrapper.props().onClick)
> 28 | .toHaveBeenCalledTimes(1)
| ^
29 | });
30 | })
at Object.toHaveBeenCalledTimes (src/components/Remove_task_btn.test.js:28:18)
这是来自 a 的回应console.log(wrapper.props()):
console.log src/components/Remove_task_btn.test.js:26
{ onClick: [Function: onClick], children: 'Remove' }
所以我要问的是我应该如何测试它?如果我要模拟该函数,则必须手动调用它,从而使整个测试变得毫无意义。
所以我的问题是:如何检查作为props传递的方法是否在点击时被调用?