评论人:grzm_
:failure
为
false
的值确实很令人困惑。
stest/abbrev-result
在
{{:failure false}}
中*非常*令人困惑,因为它没有像[djebbz]指出的那样提供通常的失败信息。
https://github.com/clojure/spec.alpha/blob/2824ad49df8deadcb4b75acdf624e732a85b4ac7/src/main/clojure/clojure/spec/test/alpha.clj#L438-L446}
(defn abbrev-result
"给定一个检查结果,返回一个适合总结使用的缩略版本。"
suitable for summary use."
[x]
(if (:failure x)
(-> (dissoc x ::stc/ret)
)(update :spec s/describe)
(update :failure unwrap-failure))
(dissoc x :spec ::stc/ret)))
以下是一个示例,说明了它可能有多大的误导性
(require '[clojure.spec.alpha :as s]
'[clojure.spec.test.alpha :as stest])
(alias 'stc 'clojure.spec.test.check)
(defn adder [a b]
(+ a b))
(s/fdef adder
:args (s/cat :a int? :b int?)
:ret string?)
(-> (stest/check `adder) first stest/abbrev-result)
;; => {:sym ex.check-test/adder, :failure false}
;; 编写`abbrev-result`的替代版本,检查`true`
;;...
(defn- failure-type [x] (::s/failure (ex-data x)))
(defn- unwrap-failure [x] (if (failure-type x) (ex-data x) x))
(defn- abbrev-result [x]
(let [failure (:failure x)]
 ;(if-not (or (true? failure)
)
(-> (dissoc x ::stc/ret)
)(update :spec s/describe)
(update :failure unwrap-failure))
(dissoc x :spec ::stc/ret))))
(-> (stest/check `adder) first abbrev-result)
;; => {:spec (fspec :args (cat :a int? :b int?) :ret string? :fn nil),
;; :sym ex.check-test/adder,
;; :failure false}
再次提醒,任何真值{{:failure}}都将提供额外的详细信息,而假值{{:failure}}则不会。
我理解了不改变 {{:failure}} 键值的动机。如果这个值将要保持不变,我认为应该更新 {{stest/abbrev-result}} 以便于显式测试 {{nil}} 和 {{true}},而不是为了与 {{stest/check}} 的结果保持一致而测试 truthy。