【问题标题】:Jest How to test error while submitting data to server from form?Jest 如何在从表单向服务器提交数据时测试错误?
【发布时间】:2018-10-27 02:51:43
【问题描述】:

考虑以下代码:

class Dashboard extends Component {
  state = {
    fileName: "",
    group: "",
    country: "",
    error: ""
  };
  onFormSubmit = async e => {
    e.preventDefault();
    const { group, country } = e.target;
    try {
      await axios.post("/api/dashboard", {
        name: group.value,
        country: country.value,
        image: this.state.fileName
      });
    } catch (error) {
      console.log(error.response.data.message);
      this.setState({ error: error.response.data.message });
    }
  };

  render() {
    return (
      <div>
        <form onSubmit={this.onFormSubmit}>
          <input
            type="text"
            onChange={this.onGroupChange}
            name="group"
            placeholder="Group Name"
            value={this.state.group}
          />
          {this.state.error}
          <input
            type="text"
            onChange={this.onCountryChange}
            name="country"
            placeholder="Country"
            value={this.state.country}
          />
          <ImageUpload
            fileName={this.state.fileName}
            onFileNameChange={this.onFileNameChange}
          />
          <button type="submit">Add Group</button>
        </form>
      </div>
    );
  }
}

我正在尝试测试当发布请求失败时error 状态是否设置为适当的值。这是到目前为止的测试:

  it("should set error state when dashboard api returns error", async () => {
    const errorMsg = "Group already exist";
    moxios.stubRequest("/api/dashboard", {
      status: 400,
      response: {
        message: errorMsg
      }
    });
    const event = {
      preventDefault: () => {},
      target: {
        group: "",
        country: ""
      }
    };
    const wrapper = shallow(<Dashboard />);
    await wrapper.find("form").simulate("submit", event);
    console.log(wrapper.state("error").value);
    expect(wrapper.state("error")).toBe(errorMsg);
  });

【问题讨论】:

  • 在expect语句之前你试过wrapper.update()吗?
  • @curlyBraces 是的

标签: reactjs jestjs enzyme moxios


【解决方案1】:

由于方法onformSubmit 是async,您可以在那里使用多种方法:

1 直接等待异步方法:

it(
  'should set error state when dashboard api returns error',
  async () => {
    const wrapper = shallow(<Dashboard />);
    await wrapper.instance().onFormSubmit(event);
    expect(wrapper.state('error')).toBe(errorMsg);
  }
);

并单独测试 onFormSubmit 方法是否在 submit 事件上被调用

2使用超时返回Promise:

it(
  'should set error state when dashboard api returns error',
  () => {
    const wrapper = shallow(<Dashboard />);
    wrapper.find("form").simulate("submit", event);
    return new Promise(resolve => setTimeout(resolve, 1)).then(() => {
      expect(wrapper.state('error')).toBe(errorMsg);
    });
  },
  1000
);

3在检查前等待打勾:

function tick() {
  return new Promise(resolve => {
    setTimeout(resolve, 1);
  });
}

...

it('should set error state when dashboard api returns error', async () => {
  const wrapper = shallow(<Dashboard />);
  wrapper.find('form').simulate('submit', event);
  await tick();
  expect(wrapper.state('error')).toBe(errorMsg);
});

4使用done回调:

it('should set error state when dashboard api returns error', done => {
  const wrapper = shallow(<Dashboard />);
  wrapper.find('form').simulate('submit', event);
  setImmediate(() => {
    expect(wrapper.state('error')).toBe(errorMsg);
    done();
  });
});

【讨论】:

  • 无论发生什么,测试都通过了。他们都没有工作。能否提供完整代码。
  • 你的第一种方法和我的完全一样
  • @UnityHour passing 是什么意思?不应该通过吗?这是测试文件代码:pastebin.com/y7gRk8mk。请注意,我将 consts 从 it 方法中移出,只是为了方便显示方法的差异。
  • 我的第一种方法是等待异步方法,而不是事件调用的结果。
  • @UnityHour 添加了另外两种方法并更新了 pastebin。他们都运作良好。
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 2015-08-28
  • 2021-03-31
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2013-03-17
相关资源
最近更新 更多