为架构编写clojure规范时遇到问题

为架构编写clojure规范时遇到问题,clojure,specifications,Clojure,Specifications,我有一个如下结构的模式 {:active? true|false :metric 90 .... } 这里的语义是,如果:active?为false,则:metric的值应为0 是的,我能做到以下几点 (s/keys :req-un [::active? ::metric] verify-structure) ;; verify-structure will test the above logic 但这并不能帮助我生成测试数据,因为其可能的验证结构可能会导致生成的所有数据失败 我想我必

我有一个如下结构的模式

{:active? true|false
 :metric 90
 ....
}
这里的语义是,如果
:active?
为false,则
:metric
的值应为
0

是的,我能做到以下几点

(s/keys :req-un [::active? ::metric] verify-structure) ;; verify-structure will test the above logic
但这并不能帮助我生成测试数据,因为其可能的验证结构可能会导致生成的所有数据失败


我想我必须构建一个自定义生成器,但我不确定如何生成依赖字段

您可以指定如下自定义生成器:

(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
将其与规范相结合,或者将其在覆盖映射中传递给接受生成器覆盖的规范函数。

这很好。谢谢