【问题标题】:Clojure Spec: Adding generators to an existing specClojure Spec:将生成器添加到现有规范
【发布时间】:2020-11-10 17:58:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • 由于规范使用全局注册表,所以最有可能最后编写规范是要走的路

标签: clojure clojure.spec


【解决方案1】:

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}})

在现有规范之上应用生成器而无需修改该规范的源代码的约定

我认为with-gen 适合于此:它采用现有规范并使用给定生成器返回该规范。

【讨论】:

  • 验证一下,您对st/check 的调用是否应该如下所示:(st/check sym-or-syms {:gen {::statement my-test-proj-generator}})
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多