如何 '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.cljuser.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"](可能是更新的版本)。