在不考虑是否应该使用前置条件和后置条件来验证函数参数的情况下,有一种方法可以通过用 包装谓词来从前置条件和后置条件中打印出更清晰的消息clojure.test/is
,如下面的答案所示:
如何让 Clojure :pre & :post 报告它们的失败值?
那么您的代码可能如下所示:
(ns pre-post-messages.core
(:require [clojure.spec :as s]
[clojure.test :as t]))
(defn person-name [person]
{:pre [(t/is (s/valid? ::person person))]
:post [(t/is (s/valid? string? %))]}
(str (::first-name person) " " (::last-name person)))
(def try-1
{:first-name "Anna Vissi"})
(def try-2
{::first-name "Anna"
::last-name "Vissi"
::email "Anna@Vissi.com"})
(s/def ::person (s/keys :req [::first-name ::last-name ::email]))
评估
pre-post-messages.core> (person-name try-2)
会产生
"Anna Vissi"
和评估
pre-post-messages.core> (person-name try-1)
会产生
FAIL in () (core.clj:6)
expected: (s/valid? :pre-post-messages.core/person person)
actual: (not (s/valid? :pre-post-messages.core/person {:first-name "Anna Vissi"}))
AssertionError Assert failed: (t/is (s/valid? :pre-post-messages.core/person person)) pre-post-messages.core/person-name (core.clj:5)