【问题标题】:How to test express app with jest when you get an async timeout error?遇到异步超时错误时如何用玩笑测试快速应用程序?
【发布时间】:2020-04-21 23:29:14
【问题描述】:

我正在测试以下端点:

app.post('/api/master/makeLeaderInZone', authenticateMaster, (request, response) => {
    var body = _.pick(request.body, ['zoneId', 'leaderId'])

    Zone.findById(body.zoneId).then((zone) => {
        if (zone) {
            return zone.addLeader(body.leaderId)
        } else {
            return Promise.reject()
        }
    }).then(() => {
        return Volunteer.findById(body.leaderId)
    }).then((volunteer) => {
        if (volunteer) {
            return volunteer.addToZoneAsLeader(body.zoneId)
        } else {
            return Promise.reject()
        }
    }).then(() => {
        response.status(200).send()
    }).catch((error) => {
        response.status(400).send()
    })
})

这是我正在使用的测试:

describe('makeLeaderInZone', () => {
    test('neither zone nor volunteer valid',  () => {
         request(app)
        .post('/api/master/makeLeaderInZone')
        .set('master-auth', 'master')
        .send().expect(400)
    })
})

当我使用邮递员对其进行测试时,该端点运行良好。但是,通过这个测试,我得到了以下错误:

超时 - 在 5000 毫秒超时内未调用异步回调 由 jest.setTimeout.Error 指定:超时 - 异步回调不是 在 jest.setTimeout 指定的 5000 毫秒超时内调用。

正如this answer 中提到的,我在测试中添加了以下代码行,让 jest 等待我的请求完成的时间更长:

jest.setTimeout(30000);

但是,我仍然得到完全相同的错误。好像 jest 忽略了这一行,只等待 5000ms。

我应该怎么做才能使这个测试工作?

【问题讨论】:

    标签: javascript node.js express asynchronous jestjs


    【解决方案1】:

    我终于明白了。我不知道为什么,但出于某种原因,如果我输入以下代码行:

    jest.setTimeout(30000);
    

    在测试函数本身内部,jest 只是忽略它并使用 5000 毫秒的默认超时值。但是,如果我将这一行放在描述块内但在测试本身之外,就像这样:

    describe('makeLeaderInZone', () => {
        jest.setTimeout(10000)
    
        test('neither zone nor volunteer valid', async () => {
            await request(app)
            .post('/api/master/makeLeaderInZone')
            .set('master-auth', 'master')
            .send().expect(400)
        })
    })
    

    它运行良好并等待我的请求完成(大约需要 8.5 秒)。

    【讨论】:

      【解决方案2】:

      只是为了确认一下,您是否将 setTimeout 选项添加到您的 jest.setup.js 文件中,如此处所引用的?

      https://jestjs.io/docs/en/configuration#setupfilesafterenv-array

      为了逐个测试地设置它,您需要将它设置为测试的第三个参数。

      test('example', async () => {
        await new Promise(resolve => setTimeout(resolve, 1000));
      }, 500);
      

      所以在你的例子中,它会是

      describe('makeLeaderInZone', () => {
          test('neither zone nor volunteer valid',  () => {
               request(app)
              .post('/api/master/makeLeaderInZone')
              .set('master-auth', 'master')
              .send().expect(400)
          }, 30000)
      })
      

      【讨论】:

      • 没有。我在测试中添加了它。那不行吗?
      • 不幸的是,如果您传递的第三个参数比默认超时值(5000 毫秒)长,jest 将简单地忽略它并使用默认值 5000 毫秒。这就是为什么,我们需要使用 jest.setTimeout() 来改变超时值。
      猜你喜欢
      • 2020-09-01
      • 2022-09-27
      • 2021-08-04
      • 2023-02-09
      • 2021-03-14
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多