在这个问题上,以及这里引用的博客帖子上,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 ...
))基本上,我希望重用由一个生成器在另一个生成器中生成的值,然后引用在实际测试代码中生成的两个值。这将从本质上扩展for-all的糖分/魔力,允许对宏提供的let样块中生成的值的引用,因为它在下面的表达式块中工作。
请让我知道,如果我错过了其他东西,使这成为可能,或它只是没有意义,因为某些原因,以实现。
发布于 2015-12-29 00:31:49
我同意这个功能可能比for-all目前所做的更有用。它没有被改变的主要原因是为了向后兼容(尽管诚然,使用旧样式的代码不会中断,但它不会像以前那样缩小)。
但你有更多的选择,而不仅仅是单子:
gen/let,它使用let-style绑定(它不是for-all的插入替代,但可以一起使用)com.gfredericks.test.chuck.generators/for助手库中定义的test.chuck --它就像gen/let的一个更高级的版本com.gfredericks.test.chuck.properties/for-all,这是for-all的插入替代。发布于 2015-12-29 00:00:32
我在该系列文章中找到了后来的博客帖子,它充分利用了test.check (需要先在monads上阅读一下才能发现它)。因此,首先可以宣布单元组:
(require '[clojure.algo.monads :as m])
(m/defmonad gen-m
[m-bind gen/bind
m-result gen/return])
(def vector-and-elem
(m/domonad gen-m
[n (gen/choose 1 10)
v (gen/vector gen/int n)
e (gen/element v)]
[n v e]))gen-m monad允许引用将为先前声明的生成器生成的值。
然后,它可以直接在for-all调用中使用:
(defspec some-props-test
(prop/for-all [[n v e] vector-and-elem]
... do stuff with n, v & e ...
))您可以通过向量(如果您愿意)传递与约束检查代码相关的所有值,并取消结构以得到所需的东西。
不过,如果这是在for-all中自动完成的话,那就太好了,但是这已经足够好了。
https://stackoverflow.com/questions/34498091
复制相似问题