我正在测试使用外部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方法。在响应中,我们将文本更改为“存在错误”。第一个测试只是寻找“错误”一词,以使测试通过并显示代码的完整评估(如果失败,测试将停止),第二个测试是我希望通过的正确命令是通过的测试。已应用。
如何确保测试用例中正确的执行顺序?
答案 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