如何使用 Jest 正确测试被拒绝的承诺?

新手上路,请多包涵

代码

import { createUser } from '../services';
...
...

handleFormSubmit = () => {
  this.setState({ loading: true });
  createUser()
    .then(() => {
      this.setState({
        loading: false,
      });
    })
    .catch(e => {
       this.setState({
         error: e,
       });
    });
};

测试

 it('rejects...', () => {
    const Container = createUserContainer(CreateUser);
    const wrapper = shallow(<Container />);

    return wrapper.instance().handleFormSubmit()
      .catch(e => {
         console.log("State: ", wrapper.state());
         expect(e).toEqual('error');
      });
 });

嘲笑

export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};

测试确实强制代码进入方法中的 catch。所以状态确实设置为“错误”。

但是在我的测试中,它并没有达到我的预期,并在测试状态更改之前等待 Promise 拒绝。我不确定在这里尝试什么,我应该使用 async/await 吗?

所以这是我想要等待的 createUser 方法,但我不确定我的实现是否允许这样做。

原文由 coding123 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 436
1 个回答

你应该这样做:

 it('rejects...', () => {
  const Container = createUserContainer(CreateUser);
  const wrapper = shallow(<Container />);
  return expect(wrapper.instance().handleFormSubmit()).rejects.toEqual('error');
});

我认为这样更干净。你可以 在官方文档 中看到这种方法。

原文由 Andres Gardiol 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进