问题标签 [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 回答
621 浏览

clojure - Clojure.spec “或”等价于“s/and”

我很喜欢和clojure.spec; 它有助于发现更接近原因的数据错误。目前我正在使用它来验证对 Web 服务器请求的响应,但是我在 clojure.spec 操作的语法上遇到了困难,该操作将允许两个不同的地图结构响应。

在我的数据中,Web 服务器请求有两种可能的响应:

{:assignment "1232123"}

{:no-more-assignments true}

我可以使用multi-spec,但这对于一些简单的事情来说似乎很冗长,例如为每种情况都有一个规范并将规范定义为:

是否有一些我忽略或需要使用的语法multi-spec

0 投票
1 回答
75 浏览

clojure - 使用 Clojure Spec 检查缺点的类型一致性?

如果我经营一个有借书人和书籍的图书馆:

我想要一个将项目添加到任一集合的通用函数:

我如何编写一个规范以确保我不能向借款人添加一本书,反之亦然?

因为这个规范:

不管用。:-(

感谢您的帮助!

0 投票
1 回答
428 浏览

clojure - Clojure 规范和解构?

不确定如何编写规范来检查函数的解构参数。

如果我有这个简单的功能:

我为这个论点写了这个规范:

它工作正常:

但是当我尝试将它应用于这样的函数时:

它爆炸了:

如何使用 Spec 编写函数::vstring2?还是我?

谢谢你。

0 投票
1 回答
347 浏览

clojure - Clojure Spec - 与规范/或嵌套在规范/和中的问题

我最近一直在尝试 Clojure Spec 并遇到了意外的错误消息。我发现如果你有一个规范/或嵌套在一个规范中/然后规范函数,在规范/或分支之后,传递一个一致的值而不是顶级值。

您可以在此处的“v”的打印值中看到这一点(人为示例):

我认为这可能是从规范/和文档字符串故意的:

采用谓词/规范形式,例如

(s/甚至?#(< % 42))

返回一个规范,该规范返回符合的值。连续一致的值通过其余谓词传播。

但这对我来说似乎违反直觉,因为它会妨碍规范谓词的重用,因为需要编写它们以接受“[<or branch> <actual value>]”。

如果您有多个规范/或分支,情况会变得更糟:

我在这里错过了一些基本的东西吗?

0 投票
1 回答
640 浏览

clojure - Clojure Spec 和“在 100 次尝试后无法满足这样的谓词......”

假设您有 a::givee和 a ::giver

那形成一个unq/gift-pair

然后你有一个:unq/gift-historywhich is a vectorof unq/gift-pair

最后,假设您要替换其中的:unq/gift-pair一个vector

一切正常:

直到我尝试stest/check它:

我曾尝试使用s/int-in限制向量计数(认为这可能是问题)但没有成功。

关于如何(stest/check `set-gift-pair-in-gift-history)正确运行的任何想法?

谢谢你。

0 投票
1 回答
411 浏览

clojure - Clojure Specs 的正确嵌套?

我想我可能对函数中嵌套规范的正确顺序有疑问 - 特别s/with-gens/or......

我有这个功能和规格:

哪个测试正确:

并且它的参数正确地符合:

但是当这个“正确”的函数被第二个函数消耗时:

消费函数成为消费函数的错误来源(nil我认为已经处理的情况):

我曾尝试更改消费函数中规范的顺序和分组(嵌套) - 但随后它未能通过它过去通过的测试,甚至在测试消费函数之前。

关于这里出了什么问题的任何想法?

谢谢!

编辑:

如建议的那样,这是完整的代码,以便更好地理解:

不幸的是,它并没有帮助我找到我的错误......

0 投票
2 回答
99 浏览

clojure - 为什么 Clojure Spec 会在这里陷入无限循环?

这是一个将视觉模式表示为 Sshapes 集合的应用程序。

Sshape(样式化形状)是点列表和样式信息图。

APattern 是包含 Sshapes 列表的记录。

这是规格:

在 sshape.clj

在groups.clj

然后在另一个文件中,我尝试测试将两个 APatterns 放在一起的叠加函数是否接受 APatterns

没有这个运行的前提条件。

有了前置条件,我得到了这个无限递归和堆栈溢出。

等等

更新 :

好的。我在 repl 中缩小了这个范围。

假设定义了一个点向量,pts

然后打电话

给我堆栈溢出:

所以它看起来只是因为我试图匹配一个 spec/* 的一个 spec/* 数字。

嵌套向量触发这种无限递归是否有某种原因?

0 投票
3 回答
465 浏览

clojure - 使用 ruby​​ Rspec 测试 CRUD Clojure 函数

我刚刚完成了使用 Clojure 的前六周工作,到目前为止,我对这种语言非常满意。我正在使用 leiningen 和 PostgreSQL 开发我的个人博客。我已经可以发布新内容、上传文件并且我有会话、cookie 和角色,无论如何我认为此时我有足够的代码开始担心测试部分,但我有点卡住了,因为看起来很多clojure 的测试和规范方面正在发生一些事情。

所以我有这个功能:

该函数将地图作为参数,并提供最终地图以由 compojure 发送和处理。我来自 Rails 世界,因此在 Rails 中测试此功能的方法是创建一个 FactoryGirl 类,使用经典创建一个 Rspec 模型文件:

在其中比较预期的内容,然后从命令行运行 rspec 以获得绿线或红线。

从昨天开始,我正在尝试使用此文档使用 Clojure 复制该过程:

https://www.codesai.com/2018/03/kata-generating-bingo-cards

但我认为目前还没有一种“标准”的方式来进行测试,包括 Clojure 中的数据库(CRUD)部分。我什至不知道将规范文件放在哪里。我看到类似于 FactoryGirl 的 Clojure 库,但我不知道是否应该使用规范创建自己的数据结构,所以我不确定从哪里开始,有 clojure.test.check.generators 和规范生成器,但我不知道知道它们是否不同,或者我是否应该只使用规范而不是 clojure.test.check。我可以从命令行而不是在 REPL 中运行测试吗?

我的意思是:是否有关于如何测试一组 CRUD 功能的文档或教程?我想我只需要最初的 HOWTO,然后我可以从那里拿走它,我会为像我这样的新手写一个教程。

更新:

看起来 Midje 是我正在寻找的东西:

https://github.com/marick/Midje/wiki/A-tutorial-introduction

0 投票
1 回答
117 浏览

clojure - 为什么我不能在规范生成器中使用 char-alpha?

我正在使用一个看起来像这样的规范:

它在生成示例时工作正常,尽管经常达到 100 次尝试的限制。我真的想要一个gen/string-alpha,虽然这个生成器不可用。

当我尝试做到这一点时:

...它说“向量的第一个参数必须是生成器”。

为什么gen/char-alpha指向 clojure.test.check.generators)不起作用?

0 投票
1 回答
273 浏览

clojure - 使用 clojure 规范在运行时验证传入我的函数的匿名函数

假设我有一个a以函数 ( fn) 作为参数的函数:

(defn a [f] ....).

为了给调用者一个很好的错误消息,我会在运行时验证fn参数。

这可能吗,我该怎么做?我可以在运行时fdef这样做,然后在调用时对其进行检测,例如:

从哲学的角度来看,这是明智的还是有意义的?