【问题标题】:Mocha with Chai HTTP async testing?Mocha 与 Chai HTTP 异步测试?
【发布时间】:2018-03-06 20:35:30
【问题描述】:

我正在使用 Mocha 和 Chai HTTP 测试一个 Rest API。我一直在使用回调编写所有测试用例,现在我想使用 async/await,因为棕褐色回调和承诺更具可读性,所以我得到了以下代码:

let sport1, sport2;
let user1, user2;
let user1Token;
let event1, event2, event3, event4;

beforeEach(async function () {
  const preUser1 = test.createUser('user1@test.com');
  const preUser2 = test.createUser('user2@test.com')

  sport1 = await Sport.create(test.createSport('Tenis'));
  sport2 = await Sport.create(test.createSport('Baloncesto'));
  user1 = await User.create(preUser1);
  user2 = await User.create(preUser2);
  event1 = await Event.create(test.createEventDb(user1._id, sport1._id));
  event2 = await Event.create(test.createEventDb(user1._id, sport2._id));
  event3 = await Event.create(test.createEventDb(user2._id, sport1._id));
  event4 = await Event.create(test.createEventDb(user2._id, sport2._id));

  await chai.request(app)
    .post(`${apiPath}/sessions`)
    .set('content-type', 'application/json')
    .send({ email: preUser1.email, password: preUser1.password })
    .end(function (err, res) {
      console.log(res.body)
      user1Token = res.body.data.session.token;
    });
});

await 语句工作正常,但这里的问题在于 chai。我收到此错误:

1) Events "before each" hook for "should return 200, id and event info":
 TypeError: First argument must be a string or Buffer
    at ClientRequest.end (_http_outgoing.js:605: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 process._tickCallback (internal/process/next_tick.js:109:7)

但如果没有 async/await 调用,则不会引发此错误。知道发生了什么吗?谢谢。

【问题讨论】:

  • 嗯,他们不会在 chai HTTP 承诺 example 中使用 .end。相反,他们打电话给.then 来获得回复。因此,如果我正确理解了 promise 示例:使用 async/await,您可以将响应保存在变量中(而不是调用 .then),然后调用 expect(或您喜欢的任何其他断言函数)。
  • 是的,我没有注意到他们在使用 Promise 时没有使用 .end() 方法。它可以完美地将响应保存在变量中并在之后进行断言,谢谢!
  • 随意回答你自己的问题:)

标签: node.js async-await mocha.js chai


【解决方案1】:

正如@Rhayene 所提到的,将 Chai 与 Promise 一起使用,您不能使用 .end() 方法,这就是我收到该错误的原因。因此,您只需将响应存储在变量中,然后进行所需的断言。所以,我重构的代码是这样的:

let sport1, sport2;
let user1, user2;
let user1Token;
let event1, event2, event3, event4;

beforeEach(async function () {
  const preUser1 = test.createUser('user1@test.com');
  const preUser2 = test.createUser('user2@test.com')

  sport1 = await Sport.create(test.createSport('Tenis'));
  sport2 = await Sport.create(test.createSport('Baloncesto'));
  user1 = await User.create(preUser1);
  user2 = await User.create(preUser2);
  event1 = await Event.create(test.createEventDb(user1._id, sport1._id));
  event2 = await Event.create(test.createEventDb(user1._id, sport2._id));
  event3 = await Event.create(test.createEventDb(user2._id, sport1._id));
  event4 = await Event.create(test.createEventDb(user2._id, sport2._id));

  const res = await chai.request(app)
    .post(`${apiPath}/sessions`)
    .set('content-type', 'application/json')
    .send({ email: preUser1.email, password: preUser1.password })

  user1Token = res.body.data.session.token;
});

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 2013-11-23
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2018-02-13
    • 2012-06-29
    相关资源
    最近更新 更多