使用 jest 测试提交以获取的 FormData

Lon*_*Dev 2 javascript reactjs jestjs

我正在使用 Jest 测试在我的 React 应用程序中调用 API。

我正在测试的代码是:

const createItem = (data) => {
  let formData = buildForm(data);

  return fetch(URL, {
    method: 'POST',
    body: formData
  });
};
Run Code Online (Sandbox Code Playgroud)

我想确认该buildForm函数正确地将 转换dataFormData对象。

我的测试是这样的:

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
      });
    });
});
Run Code Online (Sandbox Code Playgroud)

问题是,无论我expForm在测试中附加了哪些字段,此测试都会通过。似乎toHaveBeenCalledWith实际上并没有比较 的值,body只是检查它是否是一个FormData对象。

如何测试传递给bodyFormData 对象的值?

Osc*_*ett 5

您可以将 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);
Run Code Online (Sandbox Code Playgroud)