问题标签 [clojure.spec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
364 浏览

clojure - 从地图注册 clojure.specs

我有一个 clojure.specs 的地图,我想用它来在运行时验证我的请求,如下所示:

我可以在运行时使用这些规范中的任何一个来验证 using s/valid?,除了那个project-spec/project。那一个要求所有其他人都在全球规范注册表中注册才能正常工作。当我尝试使用简单doseq函数注册规范时,如果失败,因为我将局部变量传递给s/def宏并且在扩展宏之前它不会将变量解析为值。

在将变量传递给 s/def 宏之前,我尝试创建宏来评估变量,但是那个失败并带有CompilerException java.lang.UnsupportedOperationException: Can't eval locals.

我尝试的最后一件事是在传递给时评估变量,s/def但规范验证失败。

有什么方法可以实现我想做的事情吗?还是我误解了一些明显的东西?任何帮助表示赞赏!

0 投票
1 回答
958 浏览

testing - Clojure 规范与基于属性的测试库(例如 Haskell QuickCheck)有何不同?

其他语言有基于属性的测试库,比如Haskell QuickCheckClojure 规范与此类库有何不同?或者它只是Clojure的一个基于属性的测试框架?

0 投票
1 回答
97 浏览

clojure - 基于字段指定子图的内容

也许我的问题已经得到解答,但我坚持使用子图规范。

想象一下我有两种这样的可能性

简而言之::spec密钥取决于类型。对于类型:a:spec必须包含字段:name,对于类型:b,规范必须包含字段:id

我试过这个:

这告诉我:没有方法([:spec nil])。我想我明白为什么了:也许 type 是不可访问的。所以我想制作一个更高级别的多规格(基于整个地图)。

问题:我不知道如何定义:spec基于,:type因为它们具有相同的名称。您知道如何执行此操作吗?

谢谢

0 投票
1 回答
285 浏览

clojure - 在 clojure.spec 练习-fn 工作时遇到一些麻烦

在尝试使用规范库时,我在尝试使用 exercise-fn 时遇到错误。我已将其简化为主要指南页面上发布的示例,没有任何变化。

相关代码:

现在,输入以下内容

给出错误:

使用的依赖项/版本,[org.clojure/clojure "1.9.0-beta3"] [org.clojure/tools.logging "0.4.0"] [org.clojure/test.check "0.9.0"]

任何人都知道为什么这会破坏?谢谢。

0 投票
1 回答
137 浏览

clojure - 从 clojure.spec 生成的样本数据的测试序列

语境

  • 我有一个对数据结构进行操作的函数。
  • 我已经为这个函数操作的数据结构编写了一个规范。
  • 此函数返回在浏览器中呈现的试剂组件 (PhantomJS)
  • 规范有一些可选的键,根据传递给函数时数据中是否存在这些键,上述函数的输出(要在浏览器中呈现的组件)会受到影响。
  • 我希望使用clojure.test将传递给生成组件的函数的数据结构的值与从渲染元素中获取的值进行比较,因此简单的单元测试或输入->输出比较不是我要在这里进行的。

问题

由于在规范生成器上调用generateorsample有时会包含或省略可选字段,我想迭代使用sample并测试每个数据结构生成的相当大的数据集,但我不知道“正确”或惯用方法来做到这一点。

我以前用过areclojure.test这很好,但是因为我正在对浏览器中的渲染组件进行测试,并are测试输入-> 输出,所以它似乎不是适合这项工作的工具。

对于此处普遍接受的做法或 language/clojure.test 功能的建议,如果我能以最惯用的方式执行此操作,我们将不胜感激。

0 投票
1 回答
420 浏览

clojure - 重用来自 clojure 规范/键的结构定义代码

我有一个验证传入数据内容的规范定义。由于数据是字段映射,因此我spec/keys用于验证它。例如:

但我还有一个额外的需要是确保传入的数据只包含我想要的键。(在这种情况下:name:age只有键。为此,我做了类似的事情:

,确保只有那些键被过滤。

有没有一种方法可以在我的映射结构规范定义(s/keys)和我为过滤允许的键(permitted-keys)而采取的这个额外步骤之间重用一些代码?

也许通过从s/keys定义中提取键列表,或者通过将现有的键向量传递给s/keys

0 投票
1 回答
411 浏览

clojure - 如何使用规范工具从内部映射中删除额外的键

我正在尝试使用 clojure.spec 和metosin/spec-tools来验证和符合我的应用程序中的数据。在阅读了规范工具文档后,我不清楚我应该如何包装我的规范,spec-tools.core/spec以便符合的数据没有额外的键(它适用于顶级地图,但不适用于内部结构的地图)。

一些有助于澄清问题的代码:

现在假设我有以下要验证/符合的数据:

我尝试更改:req.product.create/images声明以包括st/spec调用包装s/*表单或s/keys表单,或两者兼而有之,但更改并没有改变结果。

有什么想法可以解决这个问题吗?

0 投票
1 回答
516 浏览

clojure - Clojure 和规范的编译时检查

我正在玩功能规范,我想知道是否可以使用它来模拟编译类型检查?宏是在编译时评估的,所以如果我可以这样做:

0 投票
0 回答
191 浏览

clojure - Clojure Spec 解析问题

我正在做一些编程语言练习,我正在尝试使用 Spec 来定义语言语法并对其进行解析。代码很简单,如下所示。但是我在如何使用子表达式正确解析时遇到问题。

到目前为止,它可以很好地解析基本表达式。喜欢(s/conform ::expr (pgm "let x = 7 in x"))

但是对于 let 表达式的示例,如果我将最后一个 x 更改为某个复杂的表达式,(s/conform ::expr (pgm "let x = 7 in let y = 8 in y")),解析将失败并出现以下说明:

In: [6] val: (y = 8 in y) fails spec: :eopl.let-spec/let-exp at: [:let-exp] predicate: (cat :let #{(quote let)} :id :eopl.let-spec/var-exp :eq #{(quote =)} :exp1 :eopl.let-spec/expr :in #{(quote in)} :body :eopl.let-spec/expr), Extra input

似乎它不能向前看或正确地递归符合?还是我在这里定义的语法错误?

我该如何解决这个问题才能让它用 Spec 正确解析?

提前致谢。

0 投票
2 回答
905 浏览

clojure - Clojure Spec 未正确验证数据

我对 Clojure Spec 感到非常困惑。当我通过输入在 repl 中运行时:

然后添加:

我得到//真的。当我运行时:

//错误的。好的,这样就可以了。然后,当我在 core.clj 中需要规范时:

并尝试一个简单的验证让它抛出一个错误,没有任何反应:

我不知道我在这里做错了什么,并且对规范应该如何工作感到非常困惑。我正在使用命令 lein run 来运行它。还有其他方式你应该运行它吗?