gpt4 book ai didi

javascript - 使用 Jest 的 setTimeout 测试 Promise

转载 作者:数据小太阳 更新时间:2023-10-29 03:49:04 26 4
gpt4 key购买 nike

我正在尝试了解 Jest 的异步测试。

我的模块有一个函数,它接受一个 bool 值并返回一个值的 Promise。执行器函数调用 setTimeout,并且在超时回调中,promise 根据最初提供的 bool 值解决或拒绝。代码如下所示:

const withPromises = (passes) => new Promise((resolve, reject) => {
const act = () => {
console.log(`in the timout callback, passed ${passes}`)
if(passes) resolve('something')
else reject(new Error('nothing'))
}

console.log('in the promise definition')

setTimeout(act, 50)
})

export default { withPromises }

我想使用 Jest 对此进行测试。我想我需要使用 Jest 提供的模拟计时器,所以我的测试脚本看起来有点像这样:

import { withPromises } from './request_something'

jest.useFakeTimers()

describe('using a promise and mock timers', () => {
afterAll(() => {
jest.runAllTimers()
})


test('gets a value, if conditions favor', () => {
expect.assertions(1)
return withPromises(true)
.then(resolved => {
expect(resolved).toBe('something')
})
})
})

无论我是否调用 jest.runAllTimers()

,我都会收到以下错误/失败测试
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

你能解释一下我哪里出错了,我可以做些什么来让 promise 像预期的那样通过测试吗?

最佳答案

jest.useFakeTimers() 的调用使用您必须控制的一个来模拟每个计时器函数。您可以手动推进它,而不是自动运行计时器。 jest.runTimersToTime(msToRun)函数会将其提前 msToRun 毫秒。很常见的是,您希望快进直到每个计时器都已结束,计算所有计时器完成所需的时间会很麻烦,因此 Jest 提供了 jest.runAllTimers() ,它假装已经过了足够的时间。

你的测试中的问题是你从来没有在测试中调用jest.runAllTimers(),而是在afterAll钩子(Hook)中调用它,它被称为after 测试完成。在您的测试期间,计时器保持为零,因此您的回调实际上永远不会被调用,并且 Jest 会在预定义的时间间隔(默认值:5 秒)后中止它,以防止陷入可能无休止的测试。只有在测试超时后,您才调用 jest.runAllTimers(),此时它什么都不做,因为所有测试都已完成。

您需要做的是启动 promise ,然后推进计时器。

describe('using a promise and mock timers', () => {
test('gets a value, if conditions favor', () => {
expect.assertions(1)
// Keep a reference to the pending promise.
const pendingPromise = withPromises(true)
.then(resolved => {
expect(resolved).toBe('something')
})
// Activate the timer (pretend the specified time has elapsed).
jest.runAllTimers()
// Return the promise, so Jest waits for its completion and fails the
// test when the promise is rejected.
return pendingPromise
})
})

关于javascript - 使用 Jest 的 setTimeout 测试 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46710564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com