JavaScript
Clojure
test
ClojureScript

ClojureScriptでテストを書く

ClojureScriptでテストを書く必要があったので最低限必要な物をまとめてみた。

ミニマルなテストコード

  • Clojureに同梱されているclojure.testは、ClojureScriptにポートされていてcljs.testとして同梱されている。
  • ClojureScriptのOSSでも幅広く使用されており、これを使用するのが間違いないので使用する。
(ns myapp.test
  (:require  [cljs.test :as t]))

(enable-console-print!)

(t/deftest test-foo
  (t/is (= 1 1)))

;; Runs tests in current ns
(t/run-tests)

ビルドする

ClojureScriptがクラスパスにある前提で、以下をREPLで実行する。
(ここではjvmのClojureScriptを使うが、lumoビルドapiも同様に使用できるはず)

(require '[cljs.build.api :as b])
(b/build "test" ;; Directory containing the test code
         {:main 'myapp.test ;;The ns that includes the tests
          :output-to "out/test.js" ;;Output file name
          :optimizations :simple ;; Convenient to have a single file output
          })

ブラウザで実行

  • 以下のようなhtmlファイルを作成し、スクリプトタグをビルドしたjsファイルを指すようにし、そのhtmlファイルをブラウザで開くと実行できる。
  • 実行結果はコンソールに出力される
<!DOCTYPE html>
<html>
  <head>
    <title>fiddles</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
    <script src="out/test.js" type="text/javascript"></script>
  </body>
</html>

nodejsで実行

  • 起動が早いメリットがある
  • node out/test.jsのように実行する
  • ビルドの設定に:target :nodejsを含める(今回の例は単純なので無くても動く)
(require '[cljs.build.api :as b])
(b/build "test" ;; Directory containing the test code
         {:main 'myapp.test ;;The ns that includes the tests
          :output-to "out/test.js" ;;Output file name
          :target :nodejs ;;when targeting node
          :optimizations :simple ;; Convenient to have a single file output
          })

nashornで実行

  • jdk8を使用していればjjs path/to/file/test.jsのようにして実行することができる。
  • メリットは、jdkに同梱されているので外部の何かをインストールする必要が無いこと
  • デメリットは起動がもっさりしていること
  • jjs out/test.jsのように実行する
  • プリントに使用されるデフォルトのconsoleオブジェクトが存在しないため、(set! *print-fn* js/print) を含める必要がある。
    • 含めていない場合、ReferenceError: "console" is not definedというエラーが表示される
(ns myapp.test
  (:require  [cljs.test :as t]))

(set! *print-fn* js/print)

(t/deftest test-foo
  (t/is (= 1 1)))

;; Runs tests in current ns
(t/run-tests)

TODO

他にもlein-cljsbuildtとかlein-dooとdevcardsが便利っぽいのでそのうち調べたい