Интегрировать спецификацию 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)))
Другие вопросы по тегам