整合 clojure 规范
Integrate clojure spec
这个问题可能很基础,但我是 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)
如果我将函数 (foo) 放在 abc_test 命名空间中,此测试绝对可以正常工作(测试应该会失败),但如果我需要它(如上),则测试会给出不正确的结果。
不确定这里出了什么问题。任何提示都会有所帮助。
谢谢。
在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)))
这个问题可能很基础,但我是 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)
如果我将函数 (foo) 放在 abc_test 命名空间中,此测试绝对可以正常工作(测试应该会失败),但如果我需要它(如上),则测试会给出不正确的结果。
不确定这里出了什么问题。任何提示都会有所帮助。
谢谢。
在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)))