【发布时间】:2021-07-03 12:18:54
【问题描述】:
我正在一个人学习 Clojure,我一直在做一个简单的玩具项目来创建一个 Kakebo(日本预算工具)供我学习。首先我将使用 CLI,然后是 API。
自从我刚刚开始,我就能够“了解”规范,这似乎是 clojure 中用于验证的一个很好的工具。所以,我的问题是:
- 人们测试自己的书面规范?
- 我用下面的代码测试了我的。有什么建议可以让这变得更好?
据我了解,有一些方法可以通过生成测试自动测试功能,但对于基本规范,这种测试是一种好的做法吗?
规格文件:
(ns kakebo.specs
(:require [clojure.spec.alpha :as s]))
(s/def ::entry-type #{:income :expense})
(s/def ::expense-type #{:fixed :basic :leisure :culture :extras})
(s/def ::income-type #{:salary :investment :reimbursement})
(s/def ::category-type (s/or ::expense-type ::income-type))
(s/def ::money (s/and double? #(> % 0.0)))
(s/def ::date (java.util.Date.))
(s/def ::item string?)
(s/def ::vendor (s/nilable string?))
(s/def ::entry (s/keys :req [::entry-type ::date ::item ::category-type ::vendor ::money]))
测试文件:
(ns kakebo.specs-test
(:require [midje.sweet :refer :all]
[clojure.spec.alpha :as s]
[kakebo.specs :refer :all]))
(facts "money"
(fact "bigger than zero"
(s/valid? :kakebo.specs/money 100.0) => true
(s/valid? :kakebo.specs/money -10.0) => false)
(fact "must be double"
(s/valid? :kakebo.specs/money "foo") => false
(s/valid? :kakebo.specs/money 1) => false))
(facts "entry types"
(fact "valid types"
(s/valid? :kakebo.specs/entry-type :income) => true
(s/valid? :kakebo.specs/entry-type :expense) => true
(s/valid? :kakebo.specs/entry-type :fixed) => false))
(facts "expense types"
(fact "valid types"
(s/valid? :kakebo.specs/expense-type :fixed) => true))
最后一个问题,如果我尝试以下导入,为什么我无法访问规范:
(ns specs-test
(:require [kakebo.specs :as ks]))
(fact "my-fact" (s/valid? :ks/money 100.0) => true)
【问题讨论】:
-
::ks/money应该可以工作(注意两个前导: -
@cfrick 是因为来自另一个命名空间的符号现在与当前命名空间“混合”,因此我可以使用两个
::? 访问它 -
这些文档适用于 cljs,但它们解释得很好:cljs.github.io/api/syntax/keyword-qualify
标签: unit-testing clojure clojure.spec midje clojure-testing