res.status(..).当使用 mocha、Sinon 和 Chai 运行测试时,JSON 不是一个函数



您好,我遇到了控制器的失败单元测试。我模拟了响应对象,但由于json is not a function测试一直失败,并且由于状态代码被undefined并且预计为 200,测试也失败了。

exports.getAllPrograms = async (req, res) => {
try {
let programs = [];
const result = await Program.fetchAll();
result.rows.forEach(item => {
programs.push(new Program(item.id, item.name, item.description))
});
res.status(200).json(programs);

} catch(err) {
if (!err.statusCode) {
err.statusCode = 500;
}
console.log(err);
}
}

和我的单元测试:

it('', async () => {
sinon.stub(Program, 'fetchAll')
Program.fetchAll.returns(Promise.resolve({rows:[{id:1, name:"John", description:"Having a bad day with testing"}]}))
const res = {
send: function(){},
json: (d) => {
console.log("n : " + d);;
},
status: (s) => {
this.statusCode = s;
return this;
}
};
await ProgramController.getAllPrograms({}, res);
expect(res.statusCode).to.equal(200);
Program.fetchAll.restore();
})

尝试运行测试时出现错误消息:

TypeError: res.status(...).json is not a function
at Object.exports.getAllPrograms (/Users/Documents/scratch/controllers/program.js:10:25)
at async Context.<anonymous> (/Users/Documents/scratch/test/controller-test.js:21:6) {
statusCode: 500
}
0 passing (9ms)
1 failing
1) :
AssertionError: expected undefined to equal 200
at Context.<anonymous> (test/controller-test.js:23:32)

呵呵,我想出了问题。在创建模拟对象时,我应该避免使用箭头函数。基本上用函数表达式替换箭头函数。

const res = {
send: function(){},
json: (d) => {
console.log("n : " + d);;
},
status: (s) => {
this.statusCode = s;
return this;
}
};

const res = {
send: function(){},
json: function(d) {
console.log("n : " + d);;
},
status: function(s) {
this.statusCode = s;
return this;
}
};

对于响应体,我们可以这样做

let res = {
status: (function (status) {
this.status = status
return this;
}),
json: function (body) {
this.body = body
return this;
},
}
await api(req, res)
expect(res.status).toBe(200)
expect(res).toHaveProperty('body')
expect(res.body).toBeTruthy()

最新更新