В чём разница jest.fn и jest.spyOn — Q&A Хекслет
2026-02-26 16:49 Diff

Они действительно похожи, но есть различия.

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

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

На самом деле jest.spyOn() - это просто синтаксический сахар. То же самое мы можем сделать используя базовый метод jest.fn(). Для этого нужно сохранять базовую реализацию и подменять её обратно, когда это нужно:

Возможные проблемы

Ошибка вида

TypeError: Cannot assign to read only property 'add' of object '[object Module]'

связана с особенностью экспорта из модуля, из которого отслеживается функция. Например, такой экспорт будет работать для примеров выше: