gpt4 book ai didi

reactjs - 使用 jest.fn 时,值必须是模拟或 spy 函数

转载 作者:行者123 更新时间:2023-12-03 16:23:38 26 4
gpt4 key购买 nike

收到此错误

Matcher error: received value must be a mock or spy function

Received has type:  object
Received has value: {}


但是,我认为我不应该收到此错误,因为我正在使用 jest.fn .所以我在 mock 这个功能。
describe('Should simulate button click', ()=> {
it('should simulate button click', () => {
// add the name of the prop, which in this case ites called onItemAdded prop,
// then use jest.fn()
const wrapper = shallow(<TodoAddItem onItemAdded={() => jest.fn()}/>)
// console.log('props',wrapper.find('button').props());
wrapper.find('button').simulate('click');

expect(wrapper).toHaveBeenCalled(); // error happens when this executes
})
})

todo-add-item.js
import React, { Component } from 'react';

import './todo-add-item.css';

export default class TodoAddItem extends Component {

render() {
return (
<div className="todo-add-item">

<button
className="test-button btn btn-outline-secondary float-left"
onClick={() => this.props.onItemAdded('Hello world')}>
Add Item
</button>
</div>
);
}
}

app.js (使用此文件中的组件)
import React, { Component } from 'react';

import AppHeader from '../app-header';
import SearchPanel from '../search-panel';
import TodoList from '../todo-list';
import ItemStatusFilter from '../item-status-filter';
import TodoAddItem from '../todo-add-item';

import './app.css';

export default class App extends Component {

constructor() {
super();

this.createTodoItem = (label) => {
return {
label,
important: false,
done: false,
id: this.maxId++
}
};

this.maxId = 100;

this.state = {
todoData: [
this.createTodoItem('Drink Coffee'),
this.createTodoItem('Make Awesome App'),
this.createTodoItem('Have a lunch')
]
};

this.deleteItem = (id) => {
this.setState(({ todoData }) => {
const idx = todoData.findIndex((el) => el.id === id);
const newArray = [
...todoData.slice(0, idx),
...todoData.slice(idx + 1)
];

return {
todoData: newArray
};
});
};

this.addItem = (text) => {
const newItem = this.createTodoItem(text);

this.setState(({ todoData }) => {
const newArray = [
...todoData,
newItem
];

return {
todoData: newArray
};
});
};

this.onToggleImportant = (id) => {
console.log('toggle important', id);
};

this.onToggleDone = (id) => {
console.log('toggle done', id);
};
};

render() {
return (
<div className="todo-app">
<AppHeader toDo={ 1 } done={ 3 } />
<div className="top-panel d-flex">
<SearchPanel />
<ItemStatusFilter />
</div>
<TodoList
todos={ this.state.todoData }
onDeleted={ this.deleteItem }
onToggleImportant={ this.onToggleImportant }
onToggleDone={ this.onToggleDone } />
<TodoAddItem onItemAdded={ this.addItem } />
</div>
);
};
};

最佳答案

我不是 100% 肯定,但我相信你应该做这样的事情:

describe('should simulate button click', () => {
it('should simulate button click', () => {
const mockedFunction = jest.fn();

const wrapper = shallow(<TodoAddItem onItemAdded={ mockedFunction } />);

wrapper.find('button').simulate('click');

expect(mockedFunction).toHaveBeenCalled();
});
});

您正在测试 onItemAdded单击 <TodoAddItem /> 时会调用函数成分。所以你必须先使用 jest.fn 来模拟它然后检查模拟点击后是否调用了模拟函数。

关于reactjs - 使用 jest.fn 时,值必须是模拟或 spy 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com