整合clojure规范

时间:2017-03-01 12:54:30

标签: clojure clojure.spec

这个问题可能非常基本,但我是clojure的新手,无法弄清楚如何继续这个。

abc.clj

(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)

如果我将函数(foo)放在abc_test命名空间中但是如果我需要它(如上所述),那么这个测试绝对正常(测试应该失败),那么测试会给出不正确的结果。

不确定这里出了什么问题。任何抬头都应该有所帮助。

感谢。

1 个答案:

答案 0 :(得分:3)

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)))