为模式编写 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 fmap
和 bind
调用你也可以直接使用。
获得自定义生成器后,您可以使用 s/with-gen
将其与您的规范相结合,或将其通过 overrides 映射传递给采用生成器的规范函数覆盖。
我有一个结构如下
{: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
将其与您的规范相结合,或将其通过 overrides 映射传递给采用生成器的规范函数覆盖。