onRequest Firebase函数似乎替换了异常时的响应参数对象



我目前正在尝试对HTTPS函数进行单元测试。我想测试我的错误响应,所以我自愿在我的https函数中引发异常。我发现console.debug(e)中显示了一个错误,但我在单元测试中提供的res.status().json()从未被调用,因此done()函数也从未被调用。

然而,似乎当onCreateUserAndAgency()成功时,我提供的res.json()被调用,并且测试成功。

在出现异常的情况下,是否有替换响应对象的步骤?我做错什么了吗?

我使用的堆栈是Firebase FunctionsTypescriptMocha,用于单元测试。

export default functions.https.onRequest((req, res) => {
/* here, when I put res.status(200).json({}), the test's successful so it means done() is called */
onCreateUserAndAgency({
body: req.body,
}).then(r => {
res.json(r);
}).catch(e => {
console.debug(e);
res.status(e.error.status).json(e);
})
});
describe('User', async function() {
describe('#createUser()', async function() {
it('should return error 500 for unknown errors', async function(done) {
const req: any = { };
const res: any = {
status: (status: number) => {
assert.equal(status, 500);
console.log("TEST");
done();
},
json: (data: any) => {
console.log("TEST");
done();
} 
};
fcts.createUserViaEmail(req, res);
});
});
});

错误日志:

> test
> mocha --require ts-node/register test/**/*.spec.ts
{"severity":"WARNING","message":"Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail"}

User
#createUser()
TypeError: Cannot read properties of undefined (reading 'user')
at onCreateUserAndAgency (C:UsersOrionssProjetsPATHfunctionssrcuserson-create.ts:20:70)
... Many less specific error lines
{
error: {
status: 500,
message: "Une erreur inattendue s'est produite.",
date: 2021-12-21T14:04:42.842Z
}
}
1) should return error 500 for unknown errors

0 passing (2s)
1 failing
1) User
#createUser()
should return error 400 for missing info:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:UsersOrionssProjetsPATHfunctionstestmain.spec.ts)
at listOnTimeout (node:internal/timers:557:17)
at processTimers (node:internal/timers:500:7)

我发现错误在

express res.status方法的代码(https://github.com/expressjs/express/blob/master/lib/response.js)是:

res.status = function status(code) {
this.statusCode = code;
return this;
};

但是,当我的createUserViaEmail()函数失败时,我使用res.status().send(),这意味着第一个res.status()返回this

在Javascript中,返回this似乎恢复了以前的send函数,因此done()从未被调用。

我的单元测试在异常捕获器中工作时,我这样做:

res.statusCode = e.error.status;
res.send(e);

这不是很干净,我正在寻找一个更干净的解决方法。

相关内容

  • 没有找到相关文章

最新更新