当前位置: 首页 > 知识库问答 >
问题:

使用setTimeout和Jest测试promise

龚凌
2023-03-14

我试图理解Jests的异步测试。

我的模块有一个函数,它接受一个布尔值并返回一个值的承诺。executer函数调用 ,在超时回调中,promise根据最初提供的布尔值进行解析或拒绝。代码如下所示:

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')
            })
    })
})

无论是否调用 ,我都会得到以下错误/失败测试

Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

你能解释一下我哪里出错了吗?我该怎么做才能通过考试,保证能像预期的那样解决问题吗?

共有1个答案

秦俊豪
2023-03-14

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

测试中的问题是,您从不在测试中调用 ,而是在 钩子中调用它,该钩子是在测试完成后调用的。在您的测试期间,计时器保持在零,因此您的回调从未被实际调用,Jest在预定义的间隔(默认值:5s)之后中止它,以防止被一个可能无止境的测试所困。只有在测试超时之后,您才调用 ,此时它不执行任何操作,因为所有测试都已经完成。

你需要做的是启动承诺,然后提前计时器。

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
    })
})
 类似资料:
  • 问题内容: 我有一个取决于环境变量的应用程序,例如: 我想测试例如: 可以通过节点env变量设置APP_PORT。 或某个应用程序正在使用以下命令设置的端口上运行 我如何用Jest做到这一点?我可以在每次测试之前设置这些变量,还是应该以某种方式模拟它? 问题答案: 在每次测试之前重设resetModules,然后在测试内部动态导入模块很重要: 如果您在运行Jest之前寻找一种加载env值的方法,请

  • 问题内容: 我希望能够在使用jest时使用webpack别名来解析导入,并且最好参考以避免重复。 开玩笑的conf: Webpack别名: 进口: 由于某种原因,导致了问题,因此将其删除(使用别名和导入)时,可以找到但仍然无法解决。 我尝试使用jest-webpack-alias,babel-plugin-module-resolver和Jest / Webpack docs 问题答案: 这似乎已

  • 在我的项目文件夹中,我有很多子文件夹,每个子文件夹中都有js代码和test.js文件。我想能够测试特定的文件。例如,假设在我们的项目文件夹中有“fib”文件夹: 现在,我从练习文件夹中执行jest命令: 我得到: 如果我只是开玩笑,我会做所有的测试。如果我将fib文件夹移出练习文件夹,它会按预期工作。以下是所有文件的代码: index.js: test.js: package.json: 我尝试了

  • 试图利用本SO帖子中概述的方法。 我有以下类型的例外: 这个函数抛出它: 这项工作: 但这并不: 有人知道为什么后者不起作用吗?笑话日志: