*问题*
在{{keys*}}规范中的生成器不可覆盖。
*重现*
(require '[clojure.spec.alpha :as s])
(require '[clojure.spec.gen.alpha :as gen])
(s/def ::foo (s/keys* :req-un [::a ::b]))
(s/def ::a number?)
(s/def ::b number?)
(s/valid? ::foo [:a 1 :b 2]) ;; true
(gen/generate (s/gen ::foo {::a (fn [] (gen/return 1))})) ;;=> (:a -15164 :b 24.0)
最后一个表达式应该返回一个序列,其中{{:a}}键后面跟着{{1}},类似于:{{(:a 1 :b 24.0)}}。
这可能是更普遍问题的一个迹象:覆盖使用{{with-gen}}制作的规范上的生成器似乎没有效果
(gen/generate
(s/gen (s/with-gen ::foo
(fn []
(s/gen (s/cat :key-a #{:a} :val-a ::a :key-b #{:b} :val-b ::b))))
{::a (fn [] (gen/return 1))})) ;;=> (:a -1 :b "OXi2")