我正在测试以下功能:
module.exports = {
post: function myFunc(req, res) {
some logic...
...
...
res.json(ObjectToReturn);
}
}
我正在尝试像这样使用Mocha进行测试:
it("some test", function() {
const response = myModule.post(
{ reqPayLoad },
{}
);
console.log(response)
});
但是我不断收到错误消息:
res.json不是函数
我在做什么错了?
答案 0 :(得分:1)
传递给post
的对象文字为空:{}
,
要对此进行测试,您需要对其进行模拟。
myModule.post(
{ reqPayLoad },
{ json: () => {} }
);
这里还有另一个问题。您的post
方法实际上不会返回任何内容,因此response
将是未定义的。
相反,将调用res.json()将数据发送回客户端,因此您需要检查正在调用的内容。
您可以修改模拟的json
方法以记录结果:
myModule.post(
{ reqPayLoad },
{ json: data => console.log(data) }
);
不过,为了实际测试post
的返回值,您可能需要使用Sinon spies之类的东西,才能检查以编程方式调用了res.json()。
let jsonSpy = sinon.spy();
myModule.post(
{ reqPayLoad },
{ json: jsonSpy }
);
assert(jsonSpy.calledWith(ObjectThatWasReturned));
如果post
方法是异步的,则还需要一些方法来等待它完成。我认为,最简单的方法是使用async/await
// async makes the function return a promise
post: async function myFunc(req, res) {
some logic...
...
...
res.json(ObjectToReturn);
}
然后,我们等待测试中的承诺:
// Note: we set this function as async as well
it("some test", async function() {
let jsonSpy = sinon.spy();
// wait for the promise to resolve
await myModule.post(
{ reqPayLoad },
{ json: jsonSpy }
);
assert(jsonSpy.calledWith(ObjectThatWasReturned));
});
查看有关测试异步代码的Mocha文档。这是一个示例:
it("some test", function(done) {
// wait for the promise to resolve
await myModule.post(
{ reqPayLoad },
{
json: returnObject => {
assert(returnObject).toEqual('some_object')
done()
}
}
);
});