test.check

时间:2016-11-15 13:20:08

标签: clojure test.check

我想为函数制作一个生成器。

我注意到确实存在IFn值的生成器,但是当函数域是无限的(并且因为值是严格的)时,它们通常不适用于它们用作函数的生成器。

此功能是否存在或我是否必须自己实施?

2 个答案:

答案 0 :(得分:2)

我认为答案取决于您期望该功能具有哪种行为。通常,您可以使用gen/letgen/fmap根据生成的值创建任意函数。例如,您可以生成值列表并使用它来构造一个函数,该函数根据输入的hash从列表中选择一些内容:

(gen/let [rets (gen/not-empty (gen/vector gen/any))]
  (fn [x]
    (rets (mod (hash x) (count rets)))))

答案 1 :(得分:0)

以gfredericks为基础,回答更完整的解决方案:

(defn fn-gen
  ([result-gen results-n result-scale]
   (gen/fmap
    (fn [results] (fn [& args] (get results (mod (apply + (map hash args)) results-n))))
    (gen/vector (gen/scale (partial + result-scale) result-gen) results-n)))
  ([result-gen result-n] (fn-gen result-gen result-n 10))
  ([result-gen] (fn-gen result-gen 10)))