1

This question might be very basic, but I am new to clojure and could not figure out how to proceed with this.

abc.clj :

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

I am writing clojure spec for this function in another file 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)

This test works absolutely fine (test should fail) if I put the function (foo) in abc_test namespace but if I require it (like above), then the test gives incorrect result.

Not sure what is going wrong here. Any heads up shall be helpful.

Thanks.

4

1 回答 1

3

In the s/fdef, the symbol name needs to resolve to a fully-qualified symbol. The way you have it, foo is resolving to abc_test/foo. You want it to refer to foo in the other namespace:

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

Or another trick is to leverage syntax quote (which will resolve symbols inside it given the current namespace mappings):

(s/fdef `foo
        :args (s/cat :i string?)
        :ret string?
        :fn #(> (:ret %) (-> % :args :i)))
于 2017-03-01T14:10:50.840 回答