В чем смысл mock-функций в Jest?

Насколько я понимаю, смысл mock-функций в jest - это заглушки для функций, чтобы не тащить код всего модуля и не замедлять процесс тестирования.
Однако, первый пример из документации не понятен мне от слова совсем:
Класс для теста:
// users.js
import axios from 'axios';

class Users {
  static all() {
    return axios.get('/users.json').then(resp => resp.data);
  }
}

export default Users;

Тестирование класса:
// users.test.js
import axios from 'axios';
import Users from './users';

jest.mock('axios');

test('should fetch users', () => {
  const resp = {data: [{name: 'Bob'}]};
  axios.get.mockResolvedValue(resp);

  // or you could use the following depending on your use case:
  // axios.get.mockImplementation(() => Promise.resolve(resp))

  return Users.all().then(users => expect(users).toEqual(resp.data));
});


Смысл что-либо тестить когда по итогу ты даже запрос не делаешь а имитируешь возврат результата?
  • Вопрос задан
  • 5593 просмотра
Решения вопроса 2
toxicmt
@toxicmt
CTO at hexlet.io
> Насколько я понимаю, смысл mock-функций в jest - это заглушки для функций, чтобы не тащить код всего модуля и не замедлять процесс тестирования.

Это не совсем так. Моки подразумевают, что вы прямо проверяете то что мокаете. Что функция была вызвана, что запрос был выполнен. Это и называется мокинг. А просто заглушка это стаб. Ее смысл не в том чтобы не тащить код, а в том чтобы изолировать побочные эффекты и добиться детерминированности. К последнему, например, относятся таймеры и рандомные числа. Если все это используется внутри программы, то вы не сможете просто так ее протестировать.

Подводя итог, мокают для того чтобы проверить сам мок, например вы хотите убедиться что запрос действительно делался (как в примере документации jest). В остальных случаях у вас стаб (даже если либа называет его моком). Стаб используется для того чтобы тестировать свой код, а стаб нужен только для изоляции побочного эффекта.

Ни первое ни второе напрямую с видом тестирования не связано. Моки и стабы могут применяться практически на любом уровне автоматизированного тестирования.

Темы для самостоятельного изучения:

Побочные эффекты
Детерминированность
Чистые функции
https://martinfowler.com/articles/mocksArentStubs.html
Ответ написан
Комментировать
@afanasiyz
Javascript-разработчик
В этом и смысл юнит-тестирования: Ты тестируешь только конкретный болтик в системе ( в примере выше - класс Users), подменяя все его зависимости теми, которые всегда отдадут конечный и заранее известный результат.

Например, если вдруг в этом же классе появится функция не all, а, например admins() - которая профильтрует юзеров и отдаст только админов - вы, в процессе написания теста, должны знать и входные, и выходные данные, и проверять, соответствуют ли выходные данные, как они должны быть тем, которые вернула функция.

Ключевой момент опять выделю - тестировать каждый болт, подменяя все его зависимости (они тестируются отдельно).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
24 апр. 2024, в 16:19
4000 руб./за проект
24 апр. 2024, в 15:34
20000 руб./за проект
24 апр. 2024, в 15:32
130000 руб./за проект