首页 > 解决方案 > 开玩笑在测试完成之前不等待超时

问题描述

我有一个等待异步函数的测试,然后等待超时,然后等待另一个异步函数。

it('runs a snipe successfully', async () => {
      const exitCode = await john.chat.sendMoneyInChat(channel.topicName, channel.name, "0.01", botUsername);
      console.log('timeout?')
      await timeout(3000);
      console.log('timeout!');
      console.log('running bal check')
      let values;
      const nbl = await croupier.checkWalletBalance(process.env.CROUPIER_RINGO_USERNAME);
      expect(nbl).toEqual(123);
})

根据我的 console.log 输出,afterAll拆卸过程在timeout?log 语句之后立即开始。换句话说,我timeout!在控制台日志中看不到“”——我在 afterAll 拆解中看到了 console.log 语句。

是什么赋予了?

编辑:

感谢@Metalmi 的帮助,我修复了一个错误。现在我的代码是:

  it('runs a snipe successfully', async () => {
        jest.useFakeTimers()
        const exitCode = await john.chat.sendMoneyInChat(channel.topicName, channel.name, "0.01", botUsername);
        console.log('timeout?')
        jest.advanceTimersByTime(20000)
        console.log('timeout.');
        console.log('running bal check')
        let values;
        const nbl = await croupier.checkWalletBalance(process.env.CROUPIER_RINGO_USERNAME);
        expect(nbl).toEqual(123);        
  });

这是 checkWalletBalance 函数:

  public checkWalletBalance(username: string): Promise<any> {
      let balance: number = 0;
      const self = this;
      return new Promise(async (resolve) => {
        try {
          const acct = await self.bot1.wallet.lookup(username);
          console.log("acct", acct);
          const balances = await self.bot2.wallet.balances(acct.accountId);
          console.log("balances", balances);
          balances.forEach((acctDetail) => {
            console.log(acctDetail.balance[0].amount);
            balance += parseFloat(acctDetail.balance[0].amount);
          });
          resolve(balance);
        } catch (e) {
          console.log(e);
          throw e;
        }

      });
    }

我猜 Promise 中存在异步函数的问题?

Jest 拆解在 console.log("acct", acct) 内发生之前开始checkWalletBalance,所以还是有问题。

标签: async-awaitjestjs

解决方案


要使用/测试标准计时器功能,您需要指示 jest 使用假计时器:jest.useFakeTimers()。然后需要手动提前时间:jest.advanceTimersByTime(msT​​oRun)

编辑:

问题是您将 Promise 声明为异步,而不是它checkWalletBalance()本身。改变应该可以解决它。

此外,为了确保检查断言,您可以在测试开始时调用expect.assertions(1),因此 jest 知道测试必须至少有一个断言,并且在检查之前不会完成。


推荐阅读