你能让 Supertest 等待 Express 处理程序完成执行吗?

2024-03-07

I use 超测 https://github.com/visionmedia/supertest测试我的 Express 应用程序,但当我希望处理程序进行异步处理时,我遇到了挑战after发送请求。以这段代码为例:

const request = require('supertest');
const express = require('express');

const app = express();

app.get('/user', async (req, res) => {
  res.status(200).json({ success: true });
  await someAsyncTaskThatHappensAfterTheResponse();
});

describe('A Simple Test', () => {
  it('should get a valid response', () => {
    return request(app)
      .get('/user')
      .expect(200)
      .then(response => {
          // Test stuff here.
      });
  });
});

If the someAsyncTaskThatHappensAfterTheResponse()调用抛出错误,那么这里的测试会受到竞争条件的影响,根据该错误,测试可能会失败,也可能不会失败。即使除了错误处理之外,如果在设置响应之后发生副作用,也很难检查它们是否发生。想象一下,您想在发送响应后触发数据库更新。您无法从测试中得知更新何时应该完全完成。有没有办法使用 Supertest 等待处理函数执行完毕?


这不容易完成,因为超级测试就像客户端一样,并且您无权访问 Express 中的实际 req/res 对象(请参阅https://stackoverflow.com/a/26811414/387094 https://stackoverflow.com/a/26811414/387094).

作为一个完整的解决方法,这对我有用。

创建一个包含回调/承诺的文件。例如,我的文件 test-hack.js 如下所示:

let callback = null
export const callbackPromise = () => new Promise((resolve) => {
  callback = resolve
})
export default function callWhenComplete () {
  if (callback) callback('hack complete')
}

当所有处理完成后,调用回调callWhenComplete功能。例如,我的中间件看起来像这样。

import callWhenComplete from './test-hack'

export default function middlewareIpnMyo () {
  return async function route (req, res, next) {
    res.status(200)
    res.send()

    // async logic logic
    callWhenComplete()
  }
}

最后在您的测试中,等待回调Promise,如下所示:

import { callbackPromise } from 'test-hack'

  describe('POST /someHack', () => {
    it.only('should handle a post request', async () => {

      const response = await request
        .post('/someHack')
        .send({soMuch: 'hackery'})
        .expect(200)

      const result = await callbackPromise()

      // anything below this is executed after callWhenComplete() is 
      // executed from the route

    })
})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你能让 Supertest 等待 Express 处理程序完成执行吗? 的相关文章

随机推荐