开玩笑地说,在测试完成之前没有等待超时

时间:2019-07-17 20:14:13

标签: async-await jestjs

我有一个测试,等待一个异步功能,然后等待一个超时,然后等待另一个异步功能。

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?日志语句之后立即开始。换句话说,我在控制台日志中看不到“ 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拆解开始于checkWalletBalance中的console.log(“ acct”,acct)发生之前,所以还是有问题的。

1 个答案:

答案 0 :(得分:2)

要使用/测试标准计时器功能,您需要指示玩笑使用伪造的计时器:jest.useFakeTimers()。然后,您需要手动提前时间:jest.advanceTimersByTime(msToRun)

编辑:

问题是您将Promise声明为异步的,而不是checkWalletBalance()本身。进行更改可以解决该问题。

此外,为确保确定要检查的断言,可以在测试开始时调用expect.assertions(1),以便开玩笑地知道测试必须至少具有一个断言并且在检查之前不会结束。