如何'打开'cljs.spec

时间:2017-08-04 07:59:18

标签: clojurescript

如何确保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.cljuser.cljs中的设置?

2 个答案:

答案 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。