【问题标题】:Integrate clojure spec集成 clojure 规范
【发布时间】:2017-03-01 12:54:30
【问题描述】:

这个问题可能非常基本,但我是 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 命名空间中,此测试绝对可以正常工作(测试应该失败),但如果我需要它(如上所示),那么测试会给出不正确的结果。

不确定这里出了什么问题。任何提醒都会有所帮助。

谢谢。

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多