我有以下Chai Http测试:
it("should simulate the API tier filling out a report", (done) => {
// Send some JSON
let aReport = {"name": "Jack"};
chai.request(webapp.app)
.post('/report')
.set('content-type', 'application/json')
.send(aReport)
.end((err: any, res: any) => {
expect(err).to.be.null;
expect(res.body.report).to.be.ok;
expect(res).to.have.status(200);
done();
}).catch( (error) => {
console.error('ERROR:', error);
done(error);
});
});
发送时我记录了以下错误:
TypeError: First argument must be a string or Buffer
at ClientRequest.OutgoingMessage.end (_http_outgoing.js:555:11)
at Test.Request.end (node_modules/superagent/lib/node/index.js:873:9)
at node_modules/superagent/lib/request-base.js:72:12
at Test.then (node_modules/superagent/lib/request-base.js:71:31)
at Test.exports.catch (node_modules/superagent/lib/request-base.js:81:15)
at Context.it (test/report.spec.ts:57:13)
我了解发送方法签名接受POJO并将处理正确的发布。
问题: 使用上面的方法,我如何使用chai-http正确发布JSON对象?
答案 0 :(得分:0)
查看堆栈跟踪,我认为导致错误的/report
处理程序(可能是用数字参数调用res.end()
),而不是chai-http
。
答案 1 :(得分:0)
看起来这导致request.end()被调用2x。发生这种情况是因为end()提供了catch()方法,catch()方法只能在then()之后调用。
我使用async / await和typescript重构了以下内容:
it("should simulate the API tier filling out a report", async() => {
let aReport = {"name": "Jack"};
var request = chai.request(webapp.app)
.post('/report')
.set('content-type', 'application/json');
try {
let res = await request.send(aReport);
expect(res.body).to.be.ok;
expect(res.body.id).to.be.ok;
expect(res).to.have.status(200);
} catch (e) {
expect(e).to.be.null;
}
});
答案 2 :(得分:-1)
删除catch子句修复了我的问题。也就是说,删除以下条款
.catch( (error) => {
console.error('ERROR:', error);
done(error);
});