В чем смысл mock-функций в Jest?
> Насколько я понимаю, смысл mock-функций в jest - это заглушки для функций, чтобы не тащить код всего модуля и не замедлять процесс тестирования.
Это не совсем так. Моки подразумевают, что вы прямо проверяете то что мокаете. Что функция была вызвана, что запрос был выполнен. Это и называется мокинг. А просто заглушка это стаб. Ее смысл не в том чтобы не тащить код, а в том чтобы изолировать побочные эффекты и добиться детерминированности. К последнему, например, относятся таймеры и рандомные числа. Если все это используется внутри программы, то вы не сможете просто так ее протестировать.
Подводя итог, мокают для того чтобы проверить сам мок, например вы хотите убедиться что запрос действительно делался (как в примере документации jest). В остальных случаях у вас стаб (даже если либа называет его моком). Стаб используется для того чтобы тестировать свой код, а стаб нужен только для изоляции побочного эффекта.
Ни первое ни второе напрямую с видом тестирования не связано. Моки и стабы могут применяться практически на любом уровне автоматизированного тестирования.
Темы для самостоятельного изучения:
Побочные эффекты
Детерминированность
Чистые функции
https://martinfowler.com/articles/mocksArentStubs.html
В этом и смысл юнит-тестирования: Ты тестируешь только конкретный болтик в системе ( в примере выше - класс Users), подменяя все его зависимости теми, которые всегда отдадут конечный и заранее известный результат.
Например, если вдруг в этом же классе появится функция не all, а, например admins() - которая профильтрует юзеров и отдаст только админов - вы, в процессе написания теста, должны знать и входные, и выходные данные, и проверять, соответствуют ли выходные данные, как они должны быть тем, которые вернула функция.
Ключевой момент опять выделю - тестировать каждый болт, подменяя все его зависимости (они тестируются отдельно).