为什么Chai在发布Javascript对象时会抛出TypeError?

时间:2016-11-20 18:57:04

标签: javascript mocha chai

我有以下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对象?

3 个答案:

答案 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);
  });