2017-03-01 4 views
1

この質問は非常に基本的かもしれませんが、私はclojureには新しく、これをどのように進めるのか分かりませんでした。 abc.cljclojure specを統合

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

私は abc_test.clj別のファイルに、この機能のためにClojureのスペックを書いています。

(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名前空間で(テストが失敗した)私は機能(FOO)を置けば絶対にうまく動作しますが、私は(上記のように)それを必要とする場合、テストは間違った結果を与えます。

ここで何が問題になるのかよく分かりません。どんなヘッドアップも役に立つでしょう。

ありがとうございました。

答えて

2

s/fdefでは、シンボル名を完全修飾シンボルに解決する必要があります。あなたが持っている方法、fooabc_test/fooに解決されています。

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

それとも別のトリックは、(現在の名前空間マッピング与えられ、内部にシンボルを解決します)構文の引用を活用することです:あなたは、それが他の名前空間内のfooを参照したい

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