我有一个以下结构的架构
{:active? true|false
:metric 90
....
}
这里的语义是,如果:active?
为假,那么: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
将其与规范结合使用,或者将覆盖映射传递给带有生成器覆盖的规范函数。