2

deftest を使用して定義されたテストを格納するために、Clojure がどのデータ構造を使用するのか疑問に思っていました。

私はそれがマップだと思っていて、そのクラスを PersistentArrayMap として取得することを期待していましたが、それは独自のクラスのように出てきます。

テストにレコードを使用しますか?

user=> (use 'clojure.test)
nil
user=> (deftest test-test)
#'user/test-test
user=> (class test-test)
user$test_test

テストを実行するとき、名前空間のみを提供します。名前空間内のすべてのテストをどのように自動的に識別し、それらを 1 つずつ実行し始めるのでしょうか?

これらのテストは、現在の名前空間で deftest を使用してテストを作成するたびに、ある種のテストのリストに追加されますか?

4

1 に答える 1

4

test.cljのソース コードを参照すると、 deftest マクロがvary-metaの呼び出しを通じて現在のネームスペースに var を作成することがわかります。

 (defmacro deftest
  [name & body]
   (when *load-tests*
    `(def ~(vary-meta name assoc :test `(fn [] ~@body))
      (fn [] (test-var (var ~name))))))

テスト自体はその変数内にあります。

テストを実行することは、:test が関連付けられている名前空間内のすべての var をチェックすることと同じです。

周囲の接着剤を除去すると、次のようになります。

 (doseq [v (vals (ns-interns ns))]
   (when (:test (meta v))
     (each-fixture-fn (fn [] (test-var v)))))
于 2013-10-09T06:58:14.910 に答える