如何测试Promises in Jest

xcitsw88  于 2023-09-28  发布在  Jest
关注(0)|答案(1)|浏览(157)

我在用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)

有人能帮我做这个测试吗?

2ul0zpep

2ul0zpep1#

您的问题是由于使用Promise.any导致的,如下所示:

const promises = Promise.any([getPromise1, getPromise2]);

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

相关问题