代码之家  ›  专栏  ›  技术社区  ›  LondonAppDev

使用jest测试提交到获取的formdata

  •  0
  • LondonAppDev  · 技术社区  · 8 年前

    我正在使用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 检查一下是不是 表格数据 反对。

    如何测试传入 身体 窗体数据对象?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Oscar Barrett    7 年前

    为了便于比较,可以将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);