Ваш ограничитель скорости использует метод trailing
, в котором он отменяет любые текущие вызовы, когда поступают новые ... до тех пор, пока не истечет время ожидания, в этот момент вызывается функция.
Вам просто нужно снова продвинуть таймеры, чтобы снова вызвать функцию:
jest.useFakeTimers();
test('rateLimit', () => {
const action = jest.fn();
const doAction = rateLimit(action, 100);
doAction(); // This should increment the call count
doAction(); // This shouldn't, because 100ms hasn't elapsed yet
jest.advanceTimersByTime(101);
doAction(); // This should increment the count again
jest.advanceTimersByTime(101); // <= advance the timers again
expect(action).toHaveBeenCalledTimes(2); // Success!
});
Это - хороший вопрос, но нет никакого абсолютного ответа для него:
Как отмечено Einstein:
Сделайте вещи максимально простыми, но не более простые.
Простота относительна. Принятие лучшего решения относительно количества уровней абстракции в дизайне - то, что делает великого архитектора великим. Хороший архитектор должен всегда оценивать конкретную ситуацию и делать лучший компромисс. Нет никаких серебряных пуль.
Две точки:
За прошлые четыре года эта старая собака изучила новый прием TDD. Даже когда у меня нет времени, чтобы сделать "реальный" TDD, я притворяюсь, что делаю.
Таким образом, я всегда пишу дублирующий код. Который в порядке, потому что я всегда осуществляю рефакторинг его впоследствии. Это - часть процесса написания кода, не чего-то для возвращения позже. Так как я следовал за TDD и только написал минимальный необходимый код, и так как я автоматизировал тесты, доказывающие, что код работает, если я нахожу дублирование, я могу осуществить рефакторинг его далеко в комфорте, зная, что я запущу свои тесты снова в течение и после рефакторинга. Это докажет снова, что я ничего не повредил.
Таким образом, я не размышляю о том, будет ли код снова использован - я никогда не осуществляю рефакторинг, пока он не снова используется. Так как это создается в каждом экземпляре согласно потребностям экземпляра, я знаю, что вызывающая сторона кода не была деформирована требованием сделать код универсальным. Вызывающие стороны, включая модульные тесты, были записаны для удовлетворения их неотложных потребностей. Отдельная передача рефакторинга обрабатывает более широкую потребность к не дублирующий код.
Ваш вопрос был приспособлен к фактическому дизайну кода, чем, поместить ли переменные в конфигурационный файл или в константы. Я соглашаюсь с другими ответами относительно тех отношений.
Но относительно того, написать ли обобщенный код...
По моему опыту, при написании кода конкретно для контакта с задачей под рукой, Вы только напишете подобный код в какой-то момент в будущем. Хорошо, если Вы действительно только сделаете задачу однажды, это в порядке. Но я нахожу, что большинство раз это не имеет место.
Если Вы повторяете задачу вообще затем, необходимо предпринять шаги назад и рассмотреть то, что она взяла бы для автоматизации его общим способом.
Также проверьте, что кто-то уже не сделал этого. Если они не имеют, действительно рассмотрите публикацию Вашего кода, неважно, насколько маленький или грубый это могло бы быть. Кто-то мог бы изменить к лучшему его для Вас, бесплатно.
Я дам этому выстрел, моя философия следующие:
1 - Сохраните класс/функцию файла конфигурации и синтаксического анализатора, которые являются чрезвычайно dumbed вниз и просты как возможные дать Вам душевное спокойствие, что каждый раз, когда Вам нужно что-то от него, можно получить его, не имея необходимость инстанцировать смехотворно сверхчрезмерно увеличенного в размерах XML уплотнение синтаксического анализатора конфигурационного файла. Мой файл конфигурации похож на это:
DBHostname -> XX.XX.XXX.XX
DBUsername -> foomonger
DBName -> fooDb
DBPassword -> xxxxx
ImageUploadsDir -> /uploads/images/
...
Я извлекаю то, в чем я нуждаюсь от него с помощью или статического вспомогательного метода (небольшие приложения) или одноэлементного экземпляра (большой MVC управляемые приложения) сгенерированный моим слабоумным другом ConfigHelper, который является настолько немым, он не знает, как генерировать наверху.
У меня есть эта дилемма несколько раз в мой средний рабочий день: я должен поместить это в config.txt, или я должен сделать это классом постоянный? Мой ответ, я просто не знаю - значительно позже на. Если оказывается, что это должно было быть помещено в файл конфигурации, ничто не бьется, достойный IDE с конюшней 'Находят и Замена В реализации Проектов для изменения ссылок.
3 - Файлы конфигурации вынимают кошмар из развертывания приложения, когда разработка включает сервер тестирования, сопровождаемый развертыванием на производстве - нет никакой реальной практической альтернативы. Различные экземпляры базы данных на различных машинах имеют другого дюйм/с в мире, который я понимаю.
Один из многих примеров пишет HTML-код для веб-сайта вручную по сравнению с наличием программы, автоматически генерирующей его
Это таким образом верно. В то время как мы как разработчики любим создавать машины, мы склонны тратить впустую много машин создания времени для создания машины, которую мы первоначально намеревались создать. В то время как это может быть чрезвычайно приятно, на основе опыта я могу рисковать сказать, что в большинстве ситуаций, чем больше машин Вы имеете, тем больше систем Вы имеете для поддержки, чем больше точек из отказа, тем, более ручной вкусы Вы получать от бизнес-владельцы - и это не забава. Кроме того, Вы будете склонны сталкиваться с ситуациями, где промежуточная штука генератора HTML не может произвести желаемый вывод. Таким образом, что Вы делаете, напрасно тратьте время, исправляя ошибку в штуке генератора, напрасно тратьте время, разрабатывая обходное решение вуду или просто напишите от руки HTML? Это действительно зависит от конкретного обстоятельства, но я предпочитаю последнего.
Было что-то вроде напыщенной речи, но надежда она помогла ответить на Ваш вопрос, по крайней мере, немного.
80%? Совсем не достаточно хороший для твердого кодирования поместите его в файл конфигурации.
100%? Константа может сделать.