gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:41:45 27 4
gpt4 key购买 nike

我使用Supertest测试我的 Express 应用程序,但是当我希望处理程序在请求发送后进行异步处理时,我遇到了挑战。以这段代码为例:

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.
});
});
});

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

最佳答案

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

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

创建一个包含回调/ promise 的文件。例如,我的文件 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

})
})

关于node.js - 你能让 Supertest 等待 Express 处理程序完成执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51156856/

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