mochaでフロントエンドのテスト

JavaScript Advent Calendar 2011 (フレームワークコース)6日目です。この前のエントリーで予告したとおりmochaを使ったフロントエンドでのテストについて書きます。ちなみにこの前エントリー書いたときは0.2.0だったんですけどすでに0.3.2です。

必要なファイルを読み込んでこんな感じで書きます。jQueryに依存してるみたいなのでjQueryも読み込みます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>mocha sample</title>
<link rel="stylesheet" href="mocha.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script src="mocha.js"></script>
<script>
mocha.setup('bdd');
window.onload = mocha.run;

// ここからテスト
describe("mochaのテスト", function() {
  it("1 + 1 は2になること", function() {
    // ここにテスト
  });
});
</script>
</head>
<body>
<div id="mocha"></div>
</body>
</html>

問題点はmocha自体にアサーションの機能がないのでアサーションの機能を別で用意する必要があることです。ちなみにここにサンプル的なのがあって
https://github.com/visionmedia/mocha/tree/master/test/browser

ここではこんな感じでassertを簡易的に定義してるけどこれだと実際使うのはちょっと微妙。

function assert(expr, msg) {
  if (!expr) throw new Error(msg || 'failed');
}

何かいい感じのがないかと思ったんだけど、見つからなかったんでとりあえずnode.jsのassertを適当に使えるようにしてみた。
https://gist.github.com/1433658

とりあえずmochaで定義されてるrequireを使って定義したのでNode.jsのほうと同じように使える。window.assertとかにしたほうがいいんだろうか。

var assert = require("assert");
describe("mochaのテスト", function() {
  it("1 + 1 は2になること", function() {
    assert(1 + 1, 2);
  });
});

テスト結果はこんな感じ。テストのとこクリックするとテストのコード出てきていい感じ。
http://dl.dropbox.com/u/336104/demo/mocha/index.html

あとfailとかpendingはこんな感じになる。
http://dl.dropbox.com/u/336104/demo/mocha/index2.html

grepはクエリストリングで渡せる。
http://dl.dropbox.com/u/336104/demo/mocha/index2.html?grep=fail

アサーションの問題だけどうにかすればサーバーサイドと同じコードで書けるのでよさげですね。