test.check:'properties/for-all'中的let-style行为

lee*_*eor 0 monads clojure test.check

关于这个问题,以及那里引用的博客文章,有没有理由prop/for-all不直接推出这种功能?例如:

(require '[clojure.test.check.generators :as gen])
(require '[clojure.test.check.properties :as prop])
(require '[clojure.test.check.clojure-test :refer :all])

(defspec some-props-test
  (prop/for-all [n (gen/choose 1 10)
                 v (gen/vector gen/int n) ;; treat n like its produced value
                 e (gen/element v)]
    ... do stuff with n, v & e ...
  ))
Run Code Online (Sandbox Code Playgroud)

基本上,我想重新使用产生的值通过在另一发电机一个发电机,然后引用二者实际测试码内产生的值.这实际上将糖/魔法扩展for-all为允许引用由宏提供的let-like块内的生成值,因为它在下面的表达式块中起作用.

如果我遗漏了其他可能使其成为可能的内容,或者由于某种原因而无法实施,请告诉我.

gfr*_*cks 5

我同意这个功能可能比for-all目前的功能更有用.它没有被改变的主要原因是向后兼容性(尽管使用旧样式的代码不会破坏,它不会像过去那样收缩).

但是你有更多选择,而不仅仅是monad:

  • gen/let,它使用let-style绑定(它不是替代品,for-all但你可以一起使用)
  • com.gfredericks.test.chuck.generators/fortest.chuck帮助程序库中定义- 它就像一个发烧友版本gen/let
  • com.gfredericks.test.chuck.properties/for-all,在同一个图书馆,这一个替代品for-all