无法为模式编写Clojure规范

时间:2019-02-22 15:20:15

标签: clojure specifications

我有一个以下结构的模式

{:active? true|false
 :metric 90
 ....
}

这里的语义是,如果:active?为假,则:metric的值应为0

是的,我可以执行以下操作

(s/keys :req-un [::active? ::metric] verify-structure) ;; verify-structure will test the above logic

但是这对测试数据的生成没有帮助,因为它可能的校验结构可能对所有生成的数据均失败。

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

1 个答案:

答案 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 fmapbind调用,您也可以使用直接。

有了自定义生成器后,您可以使用s/with-gen将其与您的规范结合使用,或将其传递到 overrides 映射中以传递到采用生成器替代的spec函数。