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 提出)
...