私は Clojure を独学で学んでおり、私が学ぶためのカケボ (日本の予算編成ツール) を作成するための簡単なおもちゃのプロジェクトに取り組んでいます。最初に 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)