我在用Jest测试代码时遇到了一些问题。我尝试了很多方法,但我不知道如何解决它。
基本上,我有两个函数(getPromise1和getPromise2),它们创建一个axios示例并向端点发出get请求。此外,getPromise1函数使用getToken函数,该函数发出另一个get请求。
function get() {
async function getToken() {
const http = axios.create();
return http
.post("/endpoint-1")
.then(response => response.data)
.catch(error => { throw error });
}
const getPromise1 = new Promise(async (resolve, reject) => {
const token = await getToken();
const http = axios.create({
headers: {
Authorization: `Token ${token}`
},
});
return http
.get("/endpoint-2")
.then(response => resolve(response.data))
.catch(error => reject(error));
});
const getPromise2 = new Promise((resolve, reject) => {
const http = axios.create({
headers: {
Authorization: `Token 1234`
},
});
return http
.get("/endpoint-3",)
.then(response => resolve(response.data))
.catch(error => reject(error));
});
async function init() {
const promises = Promise.any([getPromise1, getPromise2]);
promises.then((u) => {
return u;
}).catch(error => {
return error
});
}
return init();
}
在我的测试中,我使用mockImplementation来模拟post和get from axios,但是在expect块中调用的次数是不同的。我有1个post和2个get请求,但是当我试图Assert这一点时,我收到了1个post和1个get,总共有2个请求。
axios.post.mockImplementation(url => {
return Promise.resolve({
status: 200,
data: { data: '123' }
})
})
axios.get.mockImplementation(() =>
Promise.resolve({
status: 200,
data: {
id: '123'
},
})
)
await get()
expect(axios.create).toBeCalledTimes(3)
expect(axios.post).toBeCalledTimes(1)
expect(axios.get).toBeCalledTimes(2)
有人能帮我做这个测试吗?
1条答案
按热度按时间2ul0zpep1#
您的问题是由于使用
Promise.any
导致的,如下所示:any()静态方法接受一个可迭代的Promise作为输入,并返回一个Promise。当输入的任何promise实现时,返回的promise实现,第一个实现值为
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any
这意味着,不能保证两个promise都能被执行(如果第一个promise在第二个promise创建之前就被解析了,或者第二个promise中的回调还没有执行,如果你是在模仿,那么第二个
get
调用甚至不会被执行)。你想要的是
Promise.all
。all()静态方法接受一个可迭代的Promise作为输入,并返回一个Promise。当所有输入的promise都满足时(包括传递空的可迭代对象时),返回的promise满足,并具有一个满足值数组
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all