如何确保clojure / cljs.spec正在验证函数调用参数并返回值?
说我有这个功能:
(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
中的设置?
答案 0 :(得分:2)
将此代码放在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
- 修复程序是在[org.clojure/test.check "0.10.0-alpha2"]
依赖项中包含project.clj
(可能包含更新版本)。
答案 1 :(得分:1)
您可以使用instrument
检查某些符号或所有变量的args一致性。
当不带参数调用时,instrument
将所有可仪器变量包装到一个函数中,该函数在委托给原始函数之前检查args。