Во время подготовки к Code Chrysalis Immersive мне нужно было написать свои собственные спецификации и реализацию для различных методов Lodash. Я расскажу о своем решении для _.throttle (func, [wait = 0]]).

Этот метод принимает два параметра: функцию обратного вызова и число, представляющее миллисекунды. Когда функция передается в метод _.throttle, ее можно вызывать только каждые x миллисекунд. Другими словами, если вы передаете функцию обратного вызова и число 5000 в _.throttle, вы должны подождать не менее 5000 миллисекунд между вызовами функции обратного вызова. Вот мое решение:

В этом коде используются замыкания. Если вы не знакомы с закрытием JavaScript, я ранее уже публиковал сообщение об этом.

Я добавляю настраиваемое свойство inThrottle в свою переменную выполнения, которая назначается функции, возвращаемой при закрытии. Это свойство inThrottle вернет логическое значение, которое будет истинным в течение периода ожидания и ложным, когда период ожидания закончится. Когда inThrottle имеет значение false, func может быть вызван снова. Когда он будет вызван снова, inThrottle снова будет присвоено значение true, и цикл продолжится ...

Теперь, как написать спецификацию, которая может проверить, правильно ли работает эта функция?

Свои спецификации я писал с помощью Жасмина. После небольшого исследования того, как тестировать код, зависящий от времени в JavaScript, я узнал, что у Jasmine на самом деле есть встроенные фиктивные часы.

Чтобы использовать эти фиктивные часы, вы просто устанавливаете их с помощью jasmine.clock (). Install (). Вы можете перевести часы вперед на указанное количество миллисекунд с помощью метода tick () и удалить его с помощью uninstall (). Легко, правда? Мне было так приятно узнать об этой функции. Вот мой тест дроссельной заслонки: