Итак, вы пишете тест для своего компонента Angular, провайдера, эффекта, чего угодно. В него внедрено множество зависимостей. Теперь предположим, что мы проводим поверхностное тестирование, поэтому мы хотим быстро отключить эти службы, чтобы просто написать тесты, ориентированные на реализацию того, что вы тестируете. Примечание: fили сейчас мы собираемся игнорировать аргументы действительно ли это хорошая практика здесь.

Вы можете начать с чего-то вроде этого:

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

Гораздо более быстрая, простая и повторно используемая альтернатива — использование прокси-объекта JavaScript. Мы можем определить произвольный геттер, который вернет новую шпионскую шутку (jest.fn()) и сохранит ее для последующего извлечения (поэтому несколько вызовов всегда будут вызывать одну и ту же заглушку). Это выглядит примерно так:

Любой метод, который мы пытаемся вызвать для объекта, созданного из serviceMockFactory(), вернет jest.fn() — свой для каждого метода, но всегда один и тот же для одного и того же метода. Это также означает, что мы можем делать все полезные шутки, издевательские вкусности, такие как mockImplementation. Мы можем проверить фабрику с помощью быстрого теста:

Теперь мы можем заменить все наши быстрые макеты из первого примера ссылкой на эту фабрику сервисных макетов:

Мы могли бы сократить это еще больше до serviceMockForToken = token => ({ provide: token, useFactory: serviceMockFactory})

Однако у нас осталась одна небольшая проблема: мы всего лишь заглушаем методы. Что, если мы хотим получить доступ к свойству сервиса? Это можно исправить, добавив в наш прокси сеттер, который позволяет нам переопределить любой из ключей нашим собственным значением:

Теперь мы можем переопределить определенное свойство в любом заданном тесте:

TestBed.get(MyService).someProperty = of('Value has been mocked!')

И точно так же, если мы хотим имитировать возвращаемое значение метода, нам нужно только mockImplementation или mockReturnValue для одной из шутливых функций.

Готово — простой мок для любого сервиса. Что еще лучше, мы можем повторно использовать эту утилиту во всех тестах нашего приложения. Легкий!