gpt4 book ai didi

reactjs - 如何使用 Jest 和 react 测试库测试调用提交表单的按钮

转载 作者:行者123 更新时间:2023-12-02 16:18:30 25 4
gpt4 key购买 nike

所以我正在尝试测试如果单击按钮是否会触发 onSubmit 函数 - 我这样做的方式是通过测试 onSubmit 函数的内部正在调用(axios post 方法)

测试

describe('RecipeSearch', () => {
test('submit button should return post function to recipes/search/', () => {
let mock = new MockAdapter(axios);
userEvent.selectOptions(screen.getByRole('combobox'), 'Sweet');
userEvent.click(screen.getByText('Search'));

const config = {
headers: {
'Content-Type': 'application/json',
},
};
const searchRecipes = mock.onPost(
`${process.env.REACT_APP_API_URL}/recipes/search/`,
{ flavor_type: 'Sweet' },
{ config }
);
expect(searchRecipes).toHaveBeenCalled();
});
});

错误

    expect(received).toHaveBeenCalled()

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

Received has type: object
Received has value: {"abortRequest": [Function abortRequest], "abortRequestOnce": [Function abortRequestOnce], "networkError": [Function networkError], "networkErrorOnce": [Function networkErrorOnce], "passThrough": [Function passThrough], "reply": [Function reply], "replyOnce": [Function replyOnce], "timeout": [Function timeout], "timeoutOnce": [Function timeoutOnce]}

函数

const recipeSearch = (props) => {
const [formData, setFormData] = useState({
flavor_type: 'Sour',
});

const { flavor_type } = formData;

const [loading, setLoading] = useState(false);

const onChange = (e) => setFormData({ ...formData, [e.target.name]: e.target.value });

const onSubmit = (e) => {
e.preventDefault();

const config = {
headers: {
'Content-Type': 'application/json',
},
};

setLoading(true);
axios
.post(
`${process.env.REACT_APP_API_URL}/recipes/search/`,
{
flavor_type,
},
config
)
.then((res) => {
setLoading(false);
props.setRecipes(res.data);
window.scrollTo(0, 0);
})
.catch((err) => {
setLoading(false);
window.scrollTo(0, 0);
});
};

return (
<form onSubmit={(e) => onSubmit(e)}>
<div>
<div>
<div>
<label htmlFor='flavor_type'>Choose Flavor</label>
<select
name='flavor_type'
onChange={(e) => onChange(e)}
value={flavor_type}
>
<option value='Sour'>Sour</option>
<option>Sweet</option>
<option>Salty</option>
</select>
</div>

<div>
<button type='submit'>Search</button>
</div>
</div>
</div>
</form>
);
};

我已经添加了整个测试和组件代码,这样帮助会更容易。提前致谢

(添加了 onChange + onSubmit 函数)

最佳答案

创建一个 onSubmit 模拟并将其作为 prop 传递将不起作用,因为 onSubmit 回调是组件内部的,而不是 prop - 你没有从测试中访问它。

与其测试是否调用了 onSubmit,不如测试触发提交事件的结果。在这种情况下,这可能意味着验证是否发出了 axios 请求。

参见 How do I test axios in Jest?有关如何在测试中模拟 axios 的示例。

关于reactjs - 如何使用 Jest 和 react 测试库测试调用提交表单的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66110028/

25 4 0
文章推荐: Ansible/vmware_guest_network 添加后连接不上nic
文章推荐: java - 所有测试类中的所有测试终止后,在 junit 5 中运行代码
文章推荐: uuid - 覆盖 DICOM 中的像素数据时应替换哪些 DICOM UID?
文章推荐: javascript - 无法分配给对象 'property' 的只读属性 '#'