无法为模式编写clojure规范

问题描述 投票:1回答:1

我有一个以下结构的架构

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

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

是的我可以做到以下几点

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

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

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

clojure specifications
1个回答
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将其与规范结合使用,或者将覆盖映射传递给带有生成器覆盖的规范函数。

© www.soinside.com 2019 - 2024. All rights reserved.