clojure - 如何使用 `clojure.spec/+` 限制生成样本的大小?

标签 clojure clojure.spec test.check

clojure.spec/coll-of 采用 :gen-max 选项来限制生成的样本大小。 是否有 clojure.spec/+ 的类似物?

最佳答案

s/*s/+ 不采用像 :gen-max 这样的选项,但那些重复的正则表达式规范会执行 take clojure.spec.alpha/*recursion-limit* into account 。我认为这是相当粗粒度的控制,对像这样的简单规范没有实际影响,对于任何正 *recursion-limit* 来说,它似乎总是生成约 200 个元素的最长序列:

(binding [clojure.spec.alpha/*recursion-limit* 1]
  (->> (gen/sample (s/gen (s/* int?)) 200)
       (map count)
       (apply max)))

限制生成序列长度的一种方法是提供自定义生成器:

(s/def ::ints
  (s/with-gen
    (s/+ int?)
    #(gen/vector gen/int 1 10)))
(gen/sample (s/gen ::ints) 200)

这应该始终生成一个由 1-10 个整数组成的向量。

关于clojure - 如何使用 `clojure.spec/+` 限制生成样本的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44457155/

相关文章:

clojure - 在 Clojure 中,何时应该使用记录或向量来表示异构节点类型的树?

fdef 的 clojure.spec 验证

clojure - 命名空间关键字使 JSON 规范无效

clojure - 使用 test.check 生成排序数据

clojure - test.check 中的循环和状态管理

clojure - 模式匹配或多态分派(dispatch)是否可用作 clojure 中的条件结构?

clojure - 在 clojure 中处理图像的最佳方法是什么?

clojure - 为什么 clojure 中的 Symbol 可以用作函数?

具有相互依赖值的 HashMap 的 clojure 规范?