2014年08月05日

Mocha+Chai+Sinon.JS 入門

最近注目のテストフレームワーク「Mocha」、軽量ですがアサーション機能すらありませんので別のライブラリを組み合わせて使うのが一般的。今回はアサーションライブラリとして「Chai」とテストタブル用にSinon.JSをチョイス。

Mocha



Mochaはnode.jsでも利用できますがクライアントJavaScriptではGitHubからダウンロードしたmocha.cssとmocha.jsを読み込みます、今回はChaiとSinon.JSを読み込んだ以下のテンプレートで解説をします。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="mocha.css">
</head>
<body>
<div id="mocha"></div>
<script src="mocha.js"></script>
<script src="chai.js"></script>
<script src="sinon-1.10.3.js"></script>
<script>
mocha.setup('bdd');
var expect = chai.expect;
window.onload = function() {
mocha.run();
};
</script>
<script src="テストするコード"></script>
<script src="テストコード"></script>
<div id="sandbox"></div>
</body>
</html>


以下の箇所ではmochaの設定でスタイルをBDD(ビヘイビア駆動開発 )にしてchaiのexpectを利用するようにしています。

mocha.setup('bdd');
var expect = chai.expect;
window.onload = function() {
mocha.run();
};



テストコードではJasmineと同じようにdescribe()で見出しをつけて記述していきます。

describe('テスト内容', function() {
//テストコード
});


describe()は入れ子でも利用できます。

describe('テスト内容1', function() {
describe('テスト内容1-1', function() {
//テストコード
});
describe('テスト内容1-2', function() {
//テストコード
});
});


テストはit()を利用して記述します。

describe('テスト内容', function() {
it("メソッドが存在する", function() {
//テストコード
});
});


実際のテストでは以下のアサーションメソッドを利用利します。

describe('テスト内容', function() {
it("aがおんなじ", function() {
expect("a").to.equal("a");
});
});


これでブラウザを見ればテストが成功しているのがわかります。

chaiの利用方法



mochaはBDDを利用する場合はJasmineと利用方法が変わらないので問題ないでしょう。chaiは少し利用方法が違います。

.toや.equalといったメソッドをチェーンさせながら記述します。

たとえば以下のように.notを追加することでaとbは同じじゃない、つまり異なることをテストしています。

describe('テスト内容', function() {
it("aとbがちがう", function() {
expect("a").to.not.equal("b");
});
});


参考:Expect / Should - Chai

Sinon.JSの使い方



Sinon.JSはテストダブルを行うことができます。

たとえば次のような謎のメソッドがあったとします。

var a = function(){
b();
}
var b = function(){
return "b";
}


a.b()のテストは以下の様な感じでできます。

it("bのテスト", function() {
var value = b();
expect(value).to.equal("b");
});


しかし、a()のテストはできません。a()ではb()が実行されているかテストしたいのです。Sinon.JSを利用すると以下のようにテストできます。

it("aのテスト", function() {
var spy = sinon.spy(window,'b');
a();
expect(spy.callCount).to.equal(1);
});
posted by ねこまんま at 21:41 | Comment(0) | TrackBack(0) | test | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック