我正在使用Jest测试在我的React应用程序中调用API。
我正在测试的代码是:
const createItem = (data) => {
let formData = buildForm(data);
return fetch(URL, {
method: 'POST',
body: formData
});
};
我想确认buildForm
函数正确地将data
转换为FormData
对象。
我的测试如下:
it('creates item using api', () => {
let data = {name: 'test name'};
return createItem(data)
.then(() => {
let expForm = new FormData();
expForm.append('name', data.name);
expect(global.fetch).toHaveBeenCalledWith(URL, {
method: 'POST',
body: expForm
});
});
});
问题是,无论我在测试中附加到expForm
的哪些字段,该测试都通过。似乎toHaveBeenCalledWith
实际上没有比较body
的值,只是检查它是否是FormData
对象。
如何测试传递到body
FormData对象中的值?
答案 0 :(得分:0)
您可以将FormData条目转换为对象以便于比较。
expect(global.fetch).toHaveBeenCalledWith(
URL,
expect.objectContaining({ method: 'POST', body: expect.any(FormData) })
);
const formData = Array.from(global.fetch.calls[0][1].body.entries())
.reduce((acc, f) => ({ ...acc, [f[0]]: f[1] }), {});
expect(formData).toMatchObject(data);