2024 Clojure现状调查!分享您的想法。

欢迎!请参阅关于页面以了解一些关于这是如何工作的更多信息。

0
Spec

问题陈述:启用测试,并调用一个已定义规格的函数,使用lambda调用。为了验证lambda,规格使用生成性测试来测试它。这导致lambda被多次调用。如果lambda发射导弹,现在由规格发射了许多导弹。在很多情况下,这是不可接受的,因为例如它可以崩溃环境。

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

想法
- 一个fspec标志,用于禁用其验证的生成性测试。

6个答案

0

由:alexmiller

为此提出的另一个选项是,使测试函数也将其规格包裹在Instrumentation中,以根据其规格调用函数参数。

0

由:lgs32a

@Alex Miller:是的,我也考虑过这个问题,并认为它与函数的测试工作更一致,即它们在调用时进行检查。

但我没有提出这个方案,因为我不知道我们应该如何做。规格必须能够通用地替换任何地方传递给任何参数的函数,同时还要知道使用哪些规格。如何?

0

由:lgs32a

一种可能的方法是将在规范中实现“描述性遍历”作为内部或甚至是公共改进。
一个规范遍历功能将像prewalk/postwalk一样工作,但它接受一个规范和一个值,并发调用用户提供的函数,其中包含一个(子)值和它对应的(子)规范。然后,仪器包装器可以替换被fspec化的值,使用通用仪器函数。每个组成其他规范的规范都必须实现新的接口方法来遍历其子规范及其规格。

0

由:alexmiller

是的,需要这样的东西(有关规范遍历,请参见CLJ-2208)。

0

由:lgs32a

@Alex Miller: CLJ-2208单独是不够的。我们需要能够使用描述其形状的规范来通用地遍历/替换任何给定的数据结构。我应该创建一个单独的票证并概述一些启动事情的方法?还是现在就把它放在这里?

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