Вызовы it () внутри description () выполняются синхронно? - PullRequest
0 голосов
/ 06 июля 2019

Насколько я понимаю, выполнение it вызовов в наборе тестов происходит последовательно, то есть один вызов не будет выполнен, пока не завершится предыдущий.однако я вижу неприятное поведение, когда обратный вызов для второго запроса выполняется до завершения обратного вызова для первого запроса

Я не знаю, неверна ли моя предпосылка (как говорили некоторые в IRC,указав, что it вызовы должны быть независимы друг от друга и могут выполняться параллельно) или моя реализация каким-то образом ошибочна

мой вопрос: хочу ли я проверить разговор с ботом (где мне нужнодождитесь ответа от сервера, прежде чем отправлять другой запрос), могу ли я сделать это как серию вызовов it?вроде как:

describe('conversation', () => {
   it('begins chat', () => {
      fetch(server + '?hello').then(res => {
         assert.equal(res, 'EHLO');
      })
   })
   it('login request', () => {
      fetch(server + '?login=xxx').then(res => {
         assert.equal(res, 'User logged in');
      })
   })
   it('get headers', () => {
      fetch(server + '?headers').then(res => {
         assert.equal(res, '0 xxx xxxx');
      })
   })
})

или мне нужно сделать что-то вроде:

it('conversation', async () => {
   var res = await fetch(server + '?hello')
   assert.equal(res, 'EHLO');
   res = await fetch(server + '?login=xxx')
   assert.equal(res, 'User logged in');
   res = await fetch(server + '?headers')
   assert.equal(res, '0 xxx xxxx');
})

в этом случае мне нужно существенно увеличить время ожидания, так как разговор может быть длинным?

1 Ответ

1 голос
/ 06 июля 2019

fetch() асинхронно.Ваши тесты будут всегда успешными, поскольку it() обратный вызов запускает операцию fetch() и возвращает результат.При более позднем повороте цикла обработки событий вызывается обратный вызов .then() операции fetch(), который выдает исключение (или нет).Это может или не может отображаться в консоли, пока необработанное отклонение обещания.

Вы можете использовать chai-with-promises.Или, что еще проще, используйте async / await:

describe('conversation', () => {

  it('begins chat', async () => {
    const res = await fetch(server + '?hello');
    assert.equal(res, 'EHLO');
  });

  it('login request', async () => {
    const res = await fetch(server + '?login=xxx')
    assert.equal(res, 'User logged in');
  })

  it('get headers', async () => {
    const await fetch(server + '?headers');
    assert.equal(res, '0 xxx xxxx');
  })

})

Эти тесты зависят друг от друга?Тест должен быть независимым.Если вы пытаетесь проверить рукопожатие протокола, вы можете сделать что-то вроде этого:

describe('conversation', () => {

  it('does the expected', async () => {
    let res;

    res = await fetch(server + '?hello')
    assert.equal(res, 'EHLO');

    res = await fetch(server + '?login=xxx') )
    assert.equal(res, 'User logged in');

    res = await fetch(server + '?headers') )
    assert.equal(res, '0 xxx xxxx');

  })

})
...