问题描述
是否有一种干净的方法在测试代码中添加适用于另一个源文件中定义的规范的规范生成器?例如,假设我在主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
请注意,您需要使用以命名的规范,因此在上面的示例中,您需要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}})
一种约定,将生成器应用于现有规范,而无需修改该规范的来源
我认为with-gen适用于此:它采用现有规范,并使用给定的生成器返回该规范。