请在2024 Clojure调查问卷中分享您的想法!

欢迎!请查看介绍页面以了解更多关于如何使用这个网站的信息。

0
Spec

问题陈述:启用调试,并通过lambda调用一个已规范的函数。为了验证lambda,spec通过生成测试来测试它。这会导致lambda被多次调用。如果lambda发射导弹,spec现在会导致发射许多导弹。这种情况在很多场景中都是不可接受的,因为它可能会导致环境崩溃。

当前解决方案
- 不要对lambda进行规范。缺点:Spec无法在它的规范被引用的上下文中生成它。
- 将fspec-iterations设置为0。缺点:禁用所有lambda的验证。
- ???

建议
- 为fspec提供一个标志来禁用其验证的生成测试。

6 个答案

0

评论由:alexmiller

为此提出的一种另一种选择是将具有规范的功能也包装在其规范中执行的instrumented函数内部。

0

评论由:lgs32a

@Alex Miller:是的,我也考虑过这一点,并认为这与函数的instrumentation操作更为一致,即在调用时间进行检查。

但是我没有提出这个想法,因为我不知道我们应该如何实现。Spec必须能够泛型地替换在任一参数中传递的任何函数为instrumented函数,同时还要知道要使用哪些规范。怎么做?

0

评论由:lgs32a

一种可能的方法是在规范中实现“描述性遍历”作为内部或甚至公共增强。
规范遍历功能将像prewalk/postwalk一样工作,但它接受一个规范和一个值,并通过用户提供的函数调用这两个值及其对应的子规范。工具包装器可以接着用通用方式替换被fspec标记的值。每个由其他规范组成的规范都必需实现一个新接口方法以遍历其子规范和规范。

0

评论由:alexmiller

是的,我们需要这样一样的东西(见CLJ-2208以获取规范遍历的条目)。

0

评论由:lgs32a

@Alex Miller: CLJ-2208无法单独实现。我们需要能够使用描述其形状的规范来泛型地遍历/替换任何给定的数据结构。我应该创建一个单独的条目,并概述几个启动方法的途径吗?还是将它暂时放在这里?

0
参考: https://clojure.atlassian.net/browse/CLJ-2217(由lgs32a报告)
...