如何 'turn on' cljs.spec
How to 'turn on' cljs.spec
如何确保 clojure/cljs.spec 正在验证函数调用参数和 return 值?
假设我有这个功能:
(defn my-inc [x]
(inc x))
之后我有这个:
(s/fdef my-inc
:args (s/cat :x number?)
:ret number?)
此代码可以编译,因为 [cljs.spec.alpha :as s]
已被要求。
现在我调用函数,希望能产生一个错误:
(my-inc "Not a number")
我希望看到 fdef
被使用,并看到错误消息指出 my-inc
不能用字符串调用。我如何以一种非常普遍的方式实现这一点,例如在 project.clj
或 user.cljs
?
中进行设置
您可以使用 instrument
检查某些符号或所有变量的参数一致性。
当不带参数调用时,instrument
将所有可检测变量包装到一个函数中,该函数在委托给原始函数之前检查参数。
在 user.cljs
中使用此代码:
(:require
[cljs.spec.alpha :as s]
[cljs.spec.test.alpha :as ts])
(defn my-inc [x]
(inc x))
(s/fdef my-inc
:args (s/cat :x number?)
:ret number?)
(ts/instrument)
(defn x-1 []
(my-inc "Hi"))
我可以从 cljs/figwheel REPL 调用 x-1
,并得到这个失败消息:
#error {:message "Call to #'cljs.user/my-inc did not conform to spec:\nIn: [0] val: \"Hi\" fails at: [:args :x] predicate: number?\n:cljs.spec.alpha/spec #object[cljs.spec.alpha.t_cljs$spec$alpha50572]\n:cljs.spec.alpha/value (\"Hi\")\n:cljs.spec.alpha/args (\"Hi\")\n:cljs.spec.alpha/failure :instrument\n", :data #:cljs.spec.alpha{:problems [{:path [:args :x], :pred cljs.core/number?, :val "Hi", :via [], :in [0]}], :spec #object[cljs.spec.alpha.t_cljs$spec$alpha50572], :value ("Hi"), :args ("Hi"), :failure :instrument}}
在浏览器中使用 真实 项目 运行 代码时,我也会遇到一致性错误。错误显示在浏览器的开发人员控制台中。
将 (ts/instrument)
放在 user.cljs
的底部,以便为开发的所有名称空间打开检测。
编辑
以防万一您遇到此问题:https://dev.clojure.org/jira/browse/CLJS-1792
- 修复是在你的 project.clj
依赖项中包含 [org.clojure/test.check "0.10.0-alpha2"]
(可能是更新的版本)。
如何确保 clojure/cljs.spec 正在验证函数调用参数和 return 值?
假设我有这个功能:
(defn my-inc [x]
(inc x))
之后我有这个:
(s/fdef my-inc
:args (s/cat :x number?)
:ret number?)
此代码可以编译,因为 [cljs.spec.alpha :as s]
已被要求。
现在我调用函数,希望能产生一个错误:
(my-inc "Not a number")
我希望看到 fdef
被使用,并看到错误消息指出 my-inc
不能用字符串调用。我如何以一种非常普遍的方式实现这一点,例如在 project.clj
或 user.cljs
?
您可以使用 instrument
检查某些符号或所有变量的参数一致性。
当不带参数调用时,instrument
将所有可检测变量包装到一个函数中,该函数在委托给原始函数之前检查参数。
在 user.cljs
中使用此代码:
(:require
[cljs.spec.alpha :as s]
[cljs.spec.test.alpha :as ts])
(defn my-inc [x]
(inc x))
(s/fdef my-inc
:args (s/cat :x number?)
:ret number?)
(ts/instrument)
(defn x-1 []
(my-inc "Hi"))
我可以从 cljs/figwheel REPL 调用 x-1
,并得到这个失败消息:
#error {:message "Call to #'cljs.user/my-inc did not conform to spec:\nIn: [0] val: \"Hi\" fails at: [:args :x] predicate: number?\n:cljs.spec.alpha/spec #object[cljs.spec.alpha.t_cljs$spec$alpha50572]\n:cljs.spec.alpha/value (\"Hi\")\n:cljs.spec.alpha/args (\"Hi\")\n:cljs.spec.alpha/failure :instrument\n", :data #:cljs.spec.alpha{:problems [{:path [:args :x], :pred cljs.core/number?, :val "Hi", :via [], :in [0]}], :spec #object[cljs.spec.alpha.t_cljs$spec$alpha50572], :value ("Hi"), :args ("Hi"), :failure :instrument}}
在浏览器中使用 真实 项目 运行 代码时,我也会遇到一致性错误。错误显示在浏览器的开发人员控制台中。
将 (ts/instrument)
放在 user.cljs
的底部,以便为开发的所有名称空间打开检测。
编辑
以防万一您遇到此问题:https://dev.clojure.org/jira/browse/CLJS-1792
- 修复是在你的 project.clj
依赖项中包含 [org.clojure/test.check "0.10.0-alpha2"]
(可能是更新的版本)。