2012年9月13日木曜日

ClojureScriptのテスト

皆さんテスト書いてますか?
私はあまり書いてません。
テストは大事です、書きましょう。

私は現在ClojureScriptを使っているのですが、JavaScriptでのテスト方法とかよくわからないし、Clojureでテスト書きたいので、ClojureからClojureScriptを読み込もうという考えに至りました。

が、しかし。
requireなどを使って、ClojureScriptのコードを読み込むことはできませんでした。
なぜなら拡張子がcljsだから。
load-fileなども使ってみましたが、無理でした。
ClojureScriptのコードの中でrequireを使っているからです。

どうにかして拡張子がclj,classのファイル以外を読み込むことはできないのかと調べてみたところ・・・・

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L403

ベタ書き・・・!
差し替えることなど到底無理っぽい。

ならば作るしかありません、cljファイルを。

(ns onedit.test
(:require [clojure.java.io :as io])
(:use clojure.test))
(def names ["foo" "bar"])
(defn cljfile [name]
(io/file (str "test/geso/" name ".clj")))
(defn cljsfile [name]
(io/file (str "src-cljs/geso/" name ".cljs")))
(defn setup []
(doseq [name names]
(io/copy (cljsfile name) (cljfile name)))
(doseq [name names]
(use (symbol (str "geso." name)))))
(defn cleanup []
(doseq [name names]
(io/delete-file (cljfile name))))
(setup)
(defn fixture [f]
(f)
(cleanup))
(use-fixtures :once fixture)
(deftest geso
(testing "Foo Functions"
(testing "geso geso"
(is (geso?)))))
view raw gistfile1.clj hosted with ❤ by GitHub

copyしてuseしてdeleteする、悲しみあふれるコード。
cleanupのところはtry-finallyした方が良いかも。

clojure.testはfailした時にマクロを利用して述語に渡した値を展開してくれたりでなかなか便利なので割と好きです。
しかし、ここまでして使うのもどうかなと。

素直にJavaScriptのテストフレームワークを使うとか、assertで済ませる(ClojureScript本体のテスト方法)などでいいかもしれません。

0 件のコメント:

コメントを投稿