2024 Clojure 状态调查 中分享您的想法!

欢迎!有关此功能更多信息的详细情况,请查看 关于 页面。

+1
Spec

当使用 clojure.spec 进行复杂规格描述时,以及使用 clojure.spec.gen 进行生成性测试时,开发者经常会发现自己编写了许多大量依赖 clojure.spec.gen/fmap 的代码。这有时会显得不太自然且难以阅读。

为了使编写自定义生成器更简单,此补丁将 test.check/let 转换到 clojure.spec.gen。现在开发者可以更加简单地编写生成器。

3 个回答

0
_由:xcthulhu_发表的评论

例如,如果要创建一个生成长度在5到11或20到40个元素的向量生成器,组成是关键词 `:a` 或 `:b`,用户需要编写类似以下内容


(gen/fmap (fn [[n gens]] (take n gens)))
          (gen/tuple (spec/gen (spec/or :short (int-in 5 11)
                                        :long (int-in 20 40)))
                     (gen/vector (gen/elements #{:a :b}) 40)))


使用此补丁,他们可以这样编写


(gen/let [length (spec/or :short (int-in 5 11)
                          :long  (int-in 20 40))]
  (repeat length #{:a :b}))

0

由:rickmoynihan 发表的评论

最近遇到了这个有用的宏的缺失。在 Slack 上和 @gfredricks 讨论了这个问题。他提到提供的补丁似乎是对 gen/let 的一种重新实现,具有不同的行为。

他建议一个替代方案可能是让 gen/let 宏执行一个 require 调用,当成功时直接展开使用 test.check 的 let 实现。

例如:

(defmacro let [& args] (try (require ...) `(...) (catch Exception e `(throw ...))))

0
参考:https://clojure.atlassian.net/browse/CLJ-1989(由 alex+import 报告)
...