【发布时间】:2018-09-30 02:12:10
【问题描述】:
我正在尝试学习如何将overrides 与s/gen 一起使用。
我有一个 ::parent 映射,其中包含一个 ::child 映射。父母和孩子都有共同的钥匙。 要求是键在父子之间具有相同的值,例如{:a 1 :b 2 :child {:a 1 :b 2}。我知道这似乎是多余的,但问题域需要它。
下面的代码生成了示例,但不满足上面的要求。
有没有办法在两个位置使用相同的生成值?
(ns blah
(:require [clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as gen]))
(s/def ::a (s/int-in 1 5))
(s/def ::b (s/int-in 1 6))
(s/def ::child
(s/keys :req-un [::a ::b]))
(defn- parent-gen []
(let [a #(s/gen ::a)
b #(s/gen ::b)]
(s/gen ::parent-nogen
; overrides map follows
{::a a ::b b
::child #(s/gen ::child
; another overrides map
{::a a ::b b})))
(s/def ::parent-nogen
(s/keys :req-un [::a ::b ::child]))
(s/def ::parent
(s/with-gen ::parent-nogen parent-gen))
(gen/sample (s/gen ::parent))
【问题讨论】:
-
我删除了自定义生成器,编写了一个检查函数并使用
s/and将其合并到父规范中。如果锤击足够,它的作品。知道是否有问题的答案仍然会很有趣。
标签: clojure clojure.spec