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

Скажем, у нас есть эта функция:

Когда дело доходит до тестирования saveAndProcessReturn (), возникает досадная проблема, заключающаяся в том, что это сработает и ударит по API, как если бы он работал в производственной среде. Иногда это неплохо (интеграционный тест), но во многих сценариях это нежелательно.

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

Вот что произошло:

  1. Зависимость API была добавлена ​​в качестве первого аргумента функции
  2. Перед именем функции был добавлен символ подчеркивания (для обозначения частичной функции)
  3. Создается новая функция, которая выполняет частичную функцию.
  4. Импортированный модуль API предоставляется в качестве первого аргумента новой функции.

Я использовал Ramda Curry здесь, потому что это лучше, чем писать его как каррированную функцию самостоятельно, и я всегда пишу все, используя Ramda, потому что это замечательно (проверьте ramdajs.com).

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

Вы можете заглушить и полностью контролировать модуль API, вводимый в функцию, поэтому вы можете просто воспроизвести его поведение, используя sinon.stub (). Returns () или различные другие методы, которые есть у Sinon (проверьте Sinon, если у вас нет уже так круто: sinonjs.org).

Единственное, что выходит за рамки этого обзора:

  1. Сам модуль API (внешний и должен быть протестирован с помощью тестов сквозной интеграции) внутри вашего проекта
  2. Метод карри Рамды
  3. Небольшой синтаксис карри + частичное применение аргументов

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