使用Jest和Enzyme测试时,Promise.reject并等待正确的执行顺序

时间:2018-11-06 11:27:06

标签: javascript unit-testing promise jestjs enzyme

我正在测试使用外部Api.js文件的组件。在测试组件时,我正在使用

import { apiCall, } from './Api';

jest.mock('./Api');

我想测试Api调用失败的情况,以检查我的组件显示正确的错误。为此,我伪造了Api响应:

apiCall.mockImplementation( () => Promise.reject({ error: 'This is my error' }), );

但是,以这种方式模拟响应时,我无法在评估测试用例之前使其执行。 在完成测试之前,有什么方法可以等待响应发生吗?

我创建了一个显示问题的简单代码箱。由于似乎codeandbox不允许使用jest.mock,所以我只是在进行原始API调用以返回Promise.reject。

https://codesandbox.io/s/6y0rn74mzw

行为很简单:一个文本“ No error”和一个按钮,单击该按钮将调用自动返回Promise.reject的API方法。在响应中,我们将文本更改为“存在错误”。第一个测试只是寻找“错误”一词,以使测试通过并显示代码的完整评估(如果失败,测试将停止),第二个测试是我希望通过的正确命令是通过的测试。已应用。

如何确保测试用例中正确的执行顺序?

2 个答案:

答案 0 :(得分:0)

jest测试中处理承诺时,我要做的事情如下:

it('test script description', (done) => {
  apiCall()
    .then((response) => {
      // Verify the response from the promise
      done();
    });
});

我显然不是在说这是最好的解决方案(也许有人可以为您指明更好的方向),但这是唯一对我有用的解决方案!

答案 1 :(得分:0)

所以解决方案是使用setImmediate。

如果我将测试用例更改为:

it("should pass but fails due to execution order", done => {
  console.log("-----------");
  expect(true).toBe(true);
  const wrapper = mount(<App />);
  wrapper.find("button").simulate("click");
  setImmediate(() => {
    const newWrapper = wrapper.update();
    expect(newWrapper.html()).toContain("There is an error");
    done();
  });
  console.log("Third");
  console.log("-----------");
});

通过。

这里有一个很好的解释:https://github.com/kentcdodds/react-testing-library/issues/11