Clojure: как включить спецификации во всем мире?

Я хотел бы использовать спецификации clojure для проверки ввода моих функций (по крайней мере, во время разработки). До сих пор я сделал следующее: я определил спецификации и в начале функций я поставил утверждения, как в этом примере:

(defn foo [bar]
  (s/assert ::bar bar)
  (do-something-with bar))

где s — псевдоним clojure.spec.alpha. По умолчанию эти утверждения отключены (при выполнении модульных тестов с помощью midje). Я могу включить их, поместив (s/check-asserts true) в один из моих файлов. Однако я не уверен, каковы будут масштабы этой настройки. Мне кажется неправильным помещать его просто в один из исходных файлов, хотя мне кажется, что пока он работает.

Каков был бы рекомендуемый способ включить эти утверждения во время тестирования, но отключить их при развертывании приложения?


person Michael Jung    schedule 23.10.2019    source источник


Ответы (2)


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

person bfabry    schedule 23.10.2019

Также есть системное свойство clojure.spec.check-asserts, для которого можно установить значение true. Это используется для установки начального значения для проверки утверждений. См. https://clojure.org/guides/spec#_using_spec_for_validation.

person Juraj Martinka    schedule 24.10.2019
comment
Как мне установить такое системное свойство? Я не смог найти никакой хорошей информации. Это то же самое, что системное свойство Java? - person Michael Jung; 24.10.2019
comment
Да, это то же самое, что и стандартный java -D в командной строке. - person Juraj Martinka; 25.10.2019
comment
Я до сих пор не понимаю, как я могу установить системное свойство, когда запускаю тесты с помощью leiningen. Команды вроде lein midje -Dclojure.spec.check-asserts=true не работают. - person Michael Jung; 26.10.2019
comment
Поскольку leiningen обычно запускает две JVM, вам нужно указать это в project.clj. См. stackoverflow.com/questions/32323572/ - person Juraj Martinka; 27.10.2019
comment
И, как упоминалось ранее, вы можете рассмотреть возможность вызова функции check-asserts, если вы делаете это для тестов. Например, мы инструментируем все указанные функции следующим образом: :profiles {:test { :injections [(require '[orchestra.spec.test :as stest]) (stest/instrument) (.println System/err "Instrumented specs")]}} - person Juraj Martinka; 27.10.2019
comment
У меня не получилось включить ассерты системным свойством, но вызов check-asserts с инъекцией сработал: :injections [(require '[clojure.spec.alpha :as s]) (s/check-asserts true)] - person Michael Jung; 27.10.2019