Skip to content

Примеры

Использованием axios

  • axios - это JavaScript-библиотека для выполнения HTTP-запросов из браузера или Node.js. Она позволяет взаимодействовать с REST API и другими веб-сервисами.

Установим библиотеку. Выполним команду:

sh
npm i axios

Например, изменим файл main.js:

js
import axios from 'axios'

export async function getTodos() {
    try {
        const { data } = await axios.get(
            'https://jsonplaceholder.typicode.com/todos'
        )
        return data
    } catch (err) {
        console.error(err)
        return []
    }
}

Например, изменим файл main.test.js:

js
import axios from 'axios'

import { getTodos } from './main'

// шпионы для подмены поведения
const axiosSpy = jest.spyOn(axios, 'get')
const errorSpy = jest.spyOn(console, 'error')

describe('getTodos', () => {
    // после каждого теста сбрасываем все моки и шпионы
    afterEach(() => {
        jest.clearAllMocks()
    })

    test('Должен вернуть пустой массив в случае ошибки', async () => {
        const errMessage = 'Network error'

        // указываем, чтобы при следующем вызове вернулся промис с ошибкой
        axiosSpy.mockRejectedValueOnce(errMessage)

        const result = await getTodos()

        expect(errorSpy).toHaveBeenCalledWith(errMessage)
        expect(result).toEqual([])
    })

    test('Должен вернуть 200 todos', async () => {
        const result = await getTodos()

        expect(axiosSpy).toHaveBeenCalledWith(
            'https://jsonplaceholder.typicode.com/todos'
        )

        expect(result).toHaveLength(200)
    })
})

Использование uuid

  • uuid - это JavaScript-библиотека для генерации уникальных идентификаторов.

Установим библиотеку. Выполним команду:

sh
npm i uuid

Например, изменим файл main.js:

js
import { v4 } from 'uuid'

export function createTodo(title) {
    return {
        title,
        completed: false,
        id: v4(),
    }
}

export async function createTodoOnServer(title) {
    const response = await fetch(
        'https://jsonplaceholder.typicode.com/todos'
    , {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(createTodo(title)),
    })

    if (!response.ok) throw new Error('Ошибка создания todo')

    return response.json()
}

Например, изменим файл main.test.js:

js
import { createTodo, createTodoOnServer } from './main'

const mockedV4 = jest.fn(() => 'abcd')

const mockTodo = {
    id: 1,
    title: 'Todo 1',
    completed: false,
}

jest.mock('uuid', () => ({
    v4: () => mockedV4(),
}))

global.fetch = jest.fn(() =>
    Promise.resolve({
        ok: true,
        json: () => Promise.resolve(mockTodo),
    })
)

describe('createTodo', () => {
    afterEach(() => {
        jest.clearAllMocks()
    })

    test('Должен вернуть объект todo', () => {
        const title = 'Изучить Jest'

        const expectedResult = {
            title,
            completed: false,
            id: 'abcd',
        }

        const result = createTodo(title)

        expect(mockedV4).toHaveBeenCalledTimes(1)
        expect(result).toEqual(expectedResult)
    })

    test('Должен создать todo на сервере', async () => {
        const result = await createTodoOnServer('my todo')

        expect(fetch).toHaveBeenCalledTimes(1)
        expect(result).toEqual(mockTodo)
    })

    test('Должен выбросить сетевую ошибку', async () => {
        fetch.mockRejectedValueOnce('Network error')

        await expect(createTodoOnServer('my todo')).
            rejects.toMatch('Network error')
    })
})