我目前正在尝试对HTTPS函数进行单元测试。我想测试我的错误响应,所以我自愿在我的https函数中引发异常。我发现console.debug(e)
中显示了一个错误,但我在单元测试中提供的res.status().json()
从未被调用,因此done()
函数也从未被调用。
然而,似乎当onCreateUserAndAgency()
成功时,我提供的res.json()
被调用,并且测试成功。
在出现异常的情况下,是否有替换响应对象的步骤?我做错什么了吗?
我使用的堆栈是Firebase Functions
、Typescript
和Mocha
,用于单元测试。
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);
这不是很干净,我正在寻找一个更干净的解决方法。