Интегрировать спецификацию 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)
Этот тест работает абсолютно нормально (тест должен провалиться), если я поместил функцию (foo) в пространство имен abc_test, но если мне это потребуется (как выше), то тест даст неверный результат.
Не уверен, что здесь происходит не так. Любая голова должна быть полезной.
Благодарю.
1 ответ
В 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)))