Мокко с асинхронным тестированием Chai HTTP?

Я тестирую Rest API, используя Mocha и Chai HTTP. Я писал все тестовые случаи, используя обратные вызовы, и теперь я хочу использовать async/await, потому что это намного более читабельно, чем обратные вызовы и обещания, поэтому я получаю этот код:

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

beforeEach(async function () {
  const preUser1 = test.createUser('[email protected]');
  const preUser2 = test.createUser('[email protected]')

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

Заявления ожидания работают нормально, но проблема здесь с 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. Любая идея о том, что происходит? Спасибо.


person Elias Garcia    schedule 25.09.2017    source источник
comment
хм, они не используют .end в примере обещания HTTP chai. Вместо этого они вызывают .then, чтобы получить ответ. Итак, если я правильно понимаю пример обещания: с помощью async/await вы должны сохранить ответ в переменной (вместо вызова .then), а затем вызвать expect (или любую другую функцию утверждения по своему вкусу).   -  person Rhayene    schedule 26.09.2017
comment
Это правда, я не заметил, что они не используют метод .end() при использовании промисов. Он отлично работает, сохраняя ответ в переменной и делая утверждения после этого, спасибо!   -  person Elias Garcia    schedule 26.09.2017
comment
Не стесняйтесь ответить на свой вопрос :)   -  person Rhayene    schedule 26.09.2017


Ответы (1)


Как упомянул @Rhayene, чтобы использовать Chai с обещаниями, вы не можете использовать метод .end(), поэтому я получаю эту ошибку. Поэтому вместо этого вы только сохраняете ответ в переменной, а затем делаете необходимые утверждения. Итак, мой рефакторинговый код таков:

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

beforeEach(async function () {
  const preUser1 = test.createUser('[email protected]');
  const preUser2 = test.createUser('[email protected]')

  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;
});
person Elias Garcia    schedule 26.09.2017