Проблемы при написании спецификации clojure для схемы - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть схема следующей структуры

{:active? true|false
 :metric 90
 ....
}

Семантика здесь такова, что если :active? ложно, то :metric должно иметь значение 0

ДаЯ могу сделать следующее

(s/keys :req-un [::active? ::metric] verify-structure) ;; verify-structure will test the above logic

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

Я думаю, я будунужно создать собственный генератор, но я не уверен, как генерировать зависимые поля

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете указать собственный генератор, например так:

(require '[clojure.test.check.generators :as gen])

(gen/let [active? gen/boolean
          metric (if active? (s/gen int?) (gen/return 0))]
  {:active? active? :metric metric})

(gen/sample *1)
({:active? true, :metric 0} {:active? true, :metric -1} ...)

gen/let - это макрос, который позволяет вам использовать знакомый let -подобный синтаксис, но он расширяется до test.check fmapи bind вызовы, которые вы также можете использовать напрямую.

Получив свой собственный генератор, вы можете использовать s/with-gen, чтобы объединить его со своей спецификацией или передать его в переопределении сопоставление со спецификационными функциями, которые принимают переопределения генератора.

...