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

В моем предыдущем посте вы заметили, что мне пришлось привести свои зависимости к типу Typescript any, чтобы внедрить их в конструктор. Вот этот пример снова:

Теперь я мог бы легко использовать реальный тип моей сервисной зависимости и просто заглушить все ее методы. Это достаточно просто, если ваша зависимость имеет только несколько свойств. Однако, если вы вводите что-то вроде Router из Angular, у которого есть много методов и свойств, которые необходимо определить, эта стратегия может быстро стать громоздкой. Говоря языком чистого JavaScript, вам нужен всего лишь объект, у которого все свойства типа TypeScript, который вы пытаетесь имитировать, установлены в undefined. Итак, именно это я и сделал, и вот результат:

Это простая функция, которая принимает партиал в качестве параметра и возвращает этот парциал, преобразованный в желаемый тип.

Вот пример из предыдущего поста с использованием функции stub вместо приведения зависимости к типу any.