Тестирование вызовов Javascript в api с помощью jest

#javascript #asynchronous #jestjs

#javascript #асинхронный #jestjs

Вопрос:

Я пытаюсь протестировать вызов github api using jest , чтобы увидеть, возвращаются ли результаты (цель этого — проверить мои навыки модульного тестирования). Но по некоторым причинам мой код работает нормально, но по-прежнему не проходит мой тест. Я подозреваю, что я, скорее всего, не понимаю, как писать такие тесты. Ниже приведен мой код

 const functions = {
    getUserRepo: async (username) => {
    const url = `https://api.github.com/users/${username}/repos`;
    console.log(url);
    let result = [];
    await axios.get(url)
        .then(function (response) {
            response.data.forEach(value => result.push(value.name));
            return resu<
        })
        .catch(function (error) {
            return error;
        });
    }
}  
  

Этот приведенный выше код возвращает правильные результаты в array формате an, но не test выполняет приведенное ниже

 describe('Check repos from git api', () => {
test('Should return user repos', async () => {
    await functions.getUserRepo('whitehox')
        .then((response) => {
            expect(response.data).toEqual([ '57','decafreelance','decases','eexport','exportchat','flisch', 'gitprac', 'itravelcentral', 'pollark', 'portfolio', 'startereit', 'talkative', 'team-portfolio'])
        })
    });
});
  

Пожалуйста, в чем проблема test и как мне это исправить?

Комментарии:

1. Вы, вероятно, забыли вернуть результат в конце функции getUserRepo

2. Он показывает правильный результат, когда я console.log(result) . Так что я не думаю, что это проблема @edvardchen

3. Попробуйте const result = await getUserRepo('whitehox'); console.log(result); , и вы поймете, что я имею в виду

4. Сначала вы выбрасываете пример кода и error вызываете, что вы не можете использовать await в этом случае. Попробуйте запустить мой код целиком и посмотрите, что вы получите. console.log(result) вместо return result . @edvardchen

5. @edvardchen вы были правы насчет возврата результата в конце.

Ответ №1:

Необходимо исправить две вещи.

Вам нужно вернуть result из вашей функции. Это можно упростить до этого:

 const functions = {
  getUserRepo: (username) => {
    const url = `https://api.github.com/users/${username}/repos`;
    console.log(url);
    return axios.get(url)  // <= return the result
      .then(function (response) {
        return response.data.map(value => value.name);
      })
      .catch(function (error) {
        return error;
      });
  }
}
  

… что позволяет response массиву проверять его напрямую:

 describe('Check repos from git api', () => {
  test('Should return user repos', async () => {
    await functions.getUserRepo('whitehox')
      .then(response => {
        // response **is** the array
        expect(response).toEqual(['57', 'decafreelance', 'decases', 'eexport', 'exportchat', 'flisch', 'gitprac', 'itravelcentral', 'pollark', 'portfolio', 'startereit', 'talkative', 'team-portfolio', 'YorubaIndigenous']);  // Success!
      })
  });
});
  

(… и есть также новый вызываемый репозиторий 'YorubaIndigenous' , я добавил его к ожидаемому значению).