请在 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实现进行展开。如果require失败,宏可以将代码展开为抛出适当错误的代码。这大概意味着需要在依赖项中包含test.check。

例如:

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

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