2017-08-04 62 views
0

如何確保Clojure的/ cljs.spec被驗證函數調用參數和返回值?如何「打開」 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的設置中?

回答

1

有了這個代碼在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}} 

與工作時,我還可以得到一致性錯誤a real項目在瀏覽器中運行的代碼。錯誤顯示在瀏覽器的開發者控制檯中。

(ts/instrument)放在user.cljs的底部,爲所有命名空間開啓檢測以進行開發。

編輯
萬一你被這個問題擊中:https://dev.clojure.org/jira/browse/CLJS-1792 - 的解決辦法是包括[org.clojure/test.check "0.10.0-alpha2"](可能有更新的版本)在project.clj依賴性。

1

您可以使用instrument檢查ARGS符合某些符號或全部瓦爾。

不帶參數調用,instrument包裝所有instrumentable瓦爾成委託給原函數之前檢查ARGS的功能。

+0

我試圖把'(S /儀器)'在該命名空間的頂部,但'cljs.spec.alpha/instrument'是一個未聲明無功。 –

+0

我使用的是最新版本。好像我需要'[cljs.spec.test.alpha:as ts]'。我沒有意識到'儀器'是在不同的命名空間,因爲在查看鏈接時掩蓋了這一點。 –

+0

現在,當我運行該項目時,我得到'goog.require找不到:cljs.spec.test.alpha',從figwheel開始顯示。 –