2017-03-01 66 views
1

這個問題可能是非常基本的,但我是clojure新手,無法弄清楚如何進行此操作。整合clojure規範

abc.clj

(ns abc) 
(defn foo 
    [i] 
    (+ i 20)) 

我寫的Clojure規範這個功能在另一個文件abc_test.clj

(ns abc_test 
    (:require [clojure.spec :as s] 
      [clojure.spec.test :as stest] 
      [clojure.test :refer [deftest is run-tests]] 
      [abc :refer [foo]] 
      )) 

(s/fdef foo 
     :args (s/cat :i string?) 
     :ret string? 
     :fn #(> (:ret %) (-> % :args :i))) 

(deftest test_foo 
    (is (empty? (stest/check `foo)))) 

(run-tests) 

這個測試工作絕對沒問題(測試應該失敗),如果我把函數(富)在abc_test命名空間,但如果我需要它(如上述),然後測試給出不正確的結果。

不知道這裏出了什麼問題。任何擡頭都會有幫助。

謝謝。

回答

2

s/fdef中,符號名稱需要解析爲完全符合的符號。您擁有它的方式foo正在解析爲abc_test/foo。你希望它是指在FOO其他命名空間:

(s/fdef abc/foo 
     :args (s/cat :i string?) 
     :ret string? 
     :fn #(> (:ret %) (-> % :args :i))) 

或者另一個伎倆是利用語法報價(裏面考慮到當前的命名空間的映射,將解析符號):

(s/fdef `foo 
     :args (s/cat :i string?) 
     :ret string? 
     :fn #(> (:ret %) (-> % :args :i)))