我有一个以下结构的模式
{:active? true|false
:metric 90
....
}
这里的语义是,如果:active?
为假,则:metric
的值应为0
是的,我可以执行以下操作
(s/keys :req-un [::active? ::metric] verify-structure) ;; verify-structure will test the above logic
但是这对测试数据的生成没有帮助,因为它可能的校验结构可能对所有生成的数据均失败。
我想我必须构建一个自定义生成器,但是我不确定如何生成依赖字段
答案 0 :(得分:2)
您可以这样指定自定义生成器:
(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
将其与您的规范结合使用,或将其传递到 overrides 映射中以传递到采用生成器替代的spec函数。