Асинхронный запрос к API возвращает неопределенное значение в шутку

#jestjs

#jestjs

Вопрос:

Я новичок в тестировании, и, в частности, в Jest. Я следую нескольким руководствам, в которых они обрабатывают асинхронный код так, как я пытаюсь. Мой код, похоже, работает, когда я даю пользовательское обещание, которое разрешается с помощью фиктивных данных. Но когда я пытаюсь использовать axios для извлечения данных из внешнего API, Jest получает в качестве ответа undefined.

 // functions2.js
const axios = require("axios")

const fetch = () => {
    axios.get("https://jsonplaceholder.typicode.com/users")
      .then(res => res.data)
      .catch(err => err);
}

module.exports = fetch;
  
 // functions2.test.js

describe("async operation", ()=>{
    it("should be defined", ()=>{
        expect(fetch).toBeDefined()
    }); // Passed

    it("should fetch", async () => {
        expect.assertions(1);
        const data = await fetch();
        expect(data).toBeTruthy();
    }) // Did not pass, data is undefined

    it("should fetch, using promises", () => {
        expect.assertions(1);
        return fetch().then(data => {
        expect(data).toBeTruthy();
        })  // Did not pass, got 0 assertions
    })
})
  

В одном учебном пособии я столкнулся с тем, что это как-то связано с запуском Jest через Node.JS, но я не знаю, как с этим справиться, потому что я не знаю node.js.

Кроме того, я следовал руководству Traversy Media, клонировал его репозиторий Git (https://github.com/bradtraversy/jest_testing_basics ) и столкнулся с той же проблемой (хотя в видео это сработало)

Ответ №1:

Проблема в том, что вы не возвращаете обещание от fetch .

Обновите свой functions2.js до чего-то вроде:

 const fetch = async () => {
  return axios
    .get("https://jsonplaceholder.typicode.com/users")
    .then(res => res.data)
    .catch(err => err);
};