Clojure 规范:将生成器添加到现有规范

Clojure Spec: Adding generators to an existing spec

是否有一种干净的方法可以在适用于另一个源文件中定义的规范的测试代码中添加规范生成器?例如,假设我的主 src/ 目录下有以下内容:

(s/fdef my-func
   :args (s/cat 
           :statement (partial instance? java.sql.PreparedStatement))
   :ret bool?)

为了进行生成测试,我需要一个用于 statement 参数的生成器,比如生成模拟语句的生成器,但我不想将测试代码与生产混合,也不想创建其他使用它的项目库也可传递地拉下测试库。

所以我正在寻找的是在现有规范之上应用生成器的约定,而无需修改该规范的源代码。

clojure.spec.test.alpha/check 采用可选的生成器覆盖映射: https://clojure.github.io/spec.alpha/clojure.spec.test.alpha-api.html#clojure.spec.test.alpha/check

:gen        map from spec names to generator overrides

请注意,您需要使用 named 规范,因此在上面的示例中,您需要 s/def 类似 ::statement 的内容:

(s/def ::statement (partial instance? java.sql.PreparedStatement))

然后你的函数规范 :args 看起来像 (s/cat :statement ::statement).

然后您可以在您的测试项目中像这样向 check 提供生成器:

(st/check sym-or-syms {:gen {::statement my-test-proj-generator}})

a convention to apply generators atop an existing spec without having to modify the source for that spec

我认为 with-gen 适用于此:它需要一个现有规范和 returns 该规范与给定的生成器。