为模式编写 clojure 规范时遇到问题

Trouble writing clojure spec for a schema

我有一个结构如下

{: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 fmapbind 调用你也可以直接使用。

获得自定义生成器后,您可以使用 s/with-gen 将其与您的规范相结合,或将其通过 overrides 映射传递给采用生成器的规范函数覆盖。