async-await - 开玩笑在测试完成之前不等待超时
问题描述
我有一个等待异步函数的测试,然后等待超时,然后等待另一个异步函数。
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
,所以还是有问题。
解决方案
要使用/测试标准计时器功能,您需要指示 jest 使用假计时器:jest.useFakeTimers()。然后需要手动提前时间:jest.advanceTimersByTime(msToRun)
编辑:
问题是您将 Promise 声明为异步,而不是它checkWalletBalance()
本身。改变应该可以解决它。
此外,为了确保检查断言,您可以在测试开始时调用expect.assertions(1),因此 jest 知道测试必须至少有一个断言,并且在检查之前不会完成。
推荐阅读
- c# - 为什么我们在专门解码base64string时需要先转换为字节然后再转换为字符串?
- c++ - 使用 CUDA /Investigation 并行化嵌套 for 循环的 c++ 的可能性
- swift - BOMStream BOMStreamWithFileAndSys(int, off_t, size_t, int, char *, BomSys *): read: 没有这样的文件或目录
- powershell - 有没有办法使用 CLI 或使用某些命令在人群中创建用户?
- c# - 仅继承枚举的一部分
- reporting-services - SSRS - 添加总行 + 总百分比
- python - 如何在python中导出没有图像的行
- powershell - 使用 PowerShell 脚本查找过去的日期
- powershell - 通过 powershell 脚本 (MSIEXEC) 卸载补丁
- ruby-on-rails-5 - Ruby on Rails / 资产管道为空