为架构编写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.checkfmap
和bind
调用,您也可以直接使用这些调用
拥有自定义生成器后,您可以使用
s/with gen
将其与规范相结合,或者将其在覆盖映射中传递给接受生成器覆盖的规范函数。这很好。谢谢