Clojure spec - генератор проверки переопределения для предиката
Есть ли способ переопределить генератор для основной функции предиката при вызове clojure.spec.test.alpha/check
?
Можно переопределить генератор предикатов по пути внутри s/gen
:
(gen/generate
(s/gen
(s/cat :s string?)
{[:s] #(gen/return "xyz")}))
Но этот вариант не существует для test/check
:
(defn xyz [s] s)
(s/fdef xyz
:args (s/cat :s string?)
:ret string?)
;; throws
(test/check
`xyz
{:gen {[:args :s] #(gen/return "xyz")}})
Имя или символ должны быть предоставлены, но как называется string?
спекуляция? Я пытался использовать символы, оба "строки? и `строка? но это тоже не сработало.
Переопределение генератора путем упаковки string?
с s/with-gen
внутри s/fdef
заставляет генераторный код отображаться внутри документации функции... что влияет на читабельность imo.
Определение новой спецификации ::string
просто для этого не чувствует себя хорошо.
1 ответ
(ns so.spec
(:require [clojure.spec.gen.alpha :as gen]
[clojure.spec.alpha :as s]
[clojure.spec.test.alpha :as st]))
(defn xyz [s]
; only to make sure it gets called
(prn s)
s)
(s/def ::xyz-arguments (s/cat :s string?))
(s/fdef xyz
:args ::xyz-arguments
:ret string?)
(st/check
'so.spec/xyz
{:gen {::xyz-arguments #(gen/return '("xyz"))}})