Clojure spec - генератор с одной ветвью - PullRequest
0 голосов
/ 27 ноября 2018

Можно ли переопределить генератор спецификаций по умолчанию, чтобы данные всегда генерировались только для одной ветви s/or составной спецификации?

(s/def ::x
  (s/or :x-a nat-int?
        :x-b string?))

(gen/sample (s/gen ::x))
;; generate strings only

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете использовать s/with-gen для предоставления собственного генератора:

(s/def ::x
  (s/with-gen
    (s/or :x-a nat-int?
          :x-b string?)
    #(s/gen string?)))

(gen/sample (s/gen ::x))
=> ("" "j" "e" "Jmi" "" "d" "bc" "ul" "H65P0ni" "OEDK")

Вы также можете использовать его только там, где вы производите выборку, без изменения базы ::x spec:

(gen/sample (s/gen (s/with-gen ::x #(s/gen string?))))

Существуют другие спецификации функций, которые принимают карту переопределений для той же цели, например s/exercise:

(s/exercise ::x 10 {::x #(s/gen string?)})
=>
(["" [:x-b ""]]
 ["" [:x-b ""]]
 ["" [:x-b ""]]
 ["" [:x-b ""]]
 ["13R0" [:x-b "13R0"]]
 ["7cT30" [:x-b "7cT30"]]
 ["uia0b" [:x-b "uia0b"]]
 ["" [:x-b ""]]
 ["bP" [:x-b "bP"]]
 ["4k2t6bW" [:x-b "4k2t6bW"]])
...