假设我有一个返回诺言的模块。 我想模拟此承诺的不同结果,以测试此模块所在的功能。我像这样模拟模块:
jest.mock('../request', () => {
return () => new Promise((resolve, reject) => {
return resolve({
response: { ok: true }
});
});
});
我的第一个测试正在运行
test("The function resolves", () => {
const initialState = { apiData: getState("postData", {}, "ready", "POST") };
const store: any = mockStore(initialState);
return expect(
performApiRequest("postData/", {}, { data: "json" })(dispatch, () =>
store.getState()
)
).resolves.toBeUndefined();
});
现在的问题是测试另一个要解析的值应该不同的函数,例如{response:{ok:false}}。
我已经尝试了不同的方法。首先将模拟包装在函数中,然后将响应作为参数。 ->由于模拟不能超出范围变量而失败。
我尝试在测试中调用jest.doMock,但这无法正确触发请求。
我试图做
const mockResponse = jest.fn();
jest.mock("../request", () => {
return () =>
new Promise((resolve, reject) => {
return resolve({
mockResponse
});
});
});
然后调用mockResponse.mockReturnValueOnce(value)。
尚未成功。有人看到出路了吗?
答案 0 :(得分:1)
您可以使用jest.fn
在顶层创建默认的模拟函数。创建模拟后,您可以使用mockImplementation
或mockImplementationOnce
在测试用例中覆盖该函数的实现。您可以在Jest documentation中找到有关此信息的更多信息。
import request from '../request';
jest.mock("../request", () =>
jest.fn(() =>
Promise.resolve({
response: {
ok: true
}
})
)
);
test("MyTest", () => {
request.mockImplementationOnce(() =>
Promise.resolve({
response: {
ok: false
}
})
);
});
答案 1 :(得分:0)
带有打字稿的答案将是:
import request from '../request';
jest.mock("../request", () =>
jest.fn(() =>
Promise.resolve({
response: {
ok: true
}
})
)
);
test("MyTest", () => {
(request as jest.Mock).mockImplementationOnce(() =>
Promise.resolve({
response: {
ok: true
}
})
);
});