Jest юнит тест не будет ждать ответа axios - PullRequest
2 голосов
/ 21 мая 2019

Я тестирую мой проект Vue-Electron, используя шутку.В данном тесте я подделываю нажатие кнопки, чтобы запустить цепочку событий.Где-то в этой цепочке я делаю аксиос-запрос к серверу, получая данные.Тем не менее, тест не ожидает результата и просто продолжается, а затем завершается сбоем, потому что результаты еще не получены.

Прежде всего, я удостоверился, что параметры и адрес запроса были правильными, какими они были,После этого я попытался определить, было ли в компоненте определено «axios» во время тестирования, что также имело место.Тогда я убедился, что если этот запрос был отправлен, то правильным ответом был получатель, что также имело место.И, конечно, я сделал свой тест асинхронным, надеясь, что теперь он будет ждать результатов, но это был не тот случай.

Компонент:

async functionInChain(){
const response = await axios({
      url: myUrl,
      method: 'POST',
      responseType: 'arraybuffer',
      params: {
        // bind params
      },
    })
    .then((resp: any) => {
        // this goes wrong
    })
}

тест:

describe('component.vue', async() => {
test('call runBot() and see if it reacts', async() => {
    wrapper.find('v-btn.button-i-use').trigger('click')
    /*later on i expect a value to be true, however it never is. 
By setting different "checkpoints" i found out things go wrong in the axios request.*/
  })
})

Я не получаю никаких ошибок, просто не будет работать

1 Ответ

1 голос
/ 21 мая 2019

добро пожаловать в stackoverflow.Я не большой специалист по шуткам, и предоставленный вами код довольно минимален, но проблема, которая бросается в глаза, заключается в том, что вы используете await и обещания.

Асинхронный и ожидающий синтаксис был представлен какнемного сахара, чтобы обещания были приятнее.Вам больше не нужно использовать .then при вызове функции, если вы используете await.Вместо этого вы продолжаете свой код после await.Поэтому код вашего компонента должен выглядеть примерно так:

Старый код:

async functionInChain(){
  const response = await axios({
    url: myUrl,
    method: 'POST',
    responseType: 'arraybuffer',
    params: {
      // bind params
    },
  })
  .then((resp: any) => {
      // continue
  })
}

Новый код:

async functionInChain(){
  const response = await axios({
    url: myUrl,
    method: 'POST',
    responseType: 'arraybuffer',
    params: {
      // bind params
    },
  })

  // continue, as if you were now in the ".then" function, because you "await"ed.
}

Если это не решит проблему, стоило бы обновить ваш вопрос полным примером, который мы можем запустить сами.Для этого вы должны создать минимальный фрагмент кода, который воспроизводит проблему, и опубликовать ее (а не весь код решения).

...