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 该规范与给定的生成器。
是否有一种干净的方法可以在适用于另一个源文件中定义的规范的测试代码中添加规范生成器?例如,假设我的主 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 该规范与给定的生成器。