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 报告)
...