问题
test.check 的一个目标是让用户能够编写任意丰富的生成器,同时保持确定性(这对于复现失败具有明显的好处)。
目前,{{fspec}} 生成器生成一个函数,该函数通过调用 {{clojure.test.check.generators/generate}} 生成随机返回值,该函数仅用于开发,因为它绕过了 test.check 的受控伪随机数源。它还绕过了 test.check 的大小机制,因为 {{generate}} 函数始终使用 {{30}} 的大小。
可能的解决方案
我看到了两种合理的解决方案,这取决于生成的函数是否应该是纯函数(目前它不是,因为它忽略了其参数并随机生成一个返回值)。
纯函数
我们可以生成一个可能的返回值的非空向量并使用它来创建一个函数,该函数使用参数的 {{hash}} 来选择一个可能的返回值。
非纯函数
我们可以生成一个可能的返回值集合,并使用它来创建一个具有内部状态的函数,该函数循环通过可能的返回值。