Jasmine についてメモっておく

JavaScript のテスティングフレームワーク Jasmine の使い方をざっくりまとめておく。

テストスイートの定義

describe(【ラベル】, 【function】);

1
2
3
describe("ここにタイトルが入ります。", function() {
// ここにテストケースが入ります。
});

テストケースの定義

it(【ラベル】, 【function】)

1
2
3
4
5
describe("テストスイート", function() {
it ("テストケース", function() {
// ここにテストが入ります。
});
});

アサーション

expect(【比較元】).【比較用メソッド】
expect(【比較元】).not.【比較用メソッド】

1
2
3
4
5
6
7
8
9
10
11
describe("サンプルスイート", function() {
var hoge;
it ("変数の値が true かどうかを確認する", function() {
hoge = true;
expect(hoge).toBe(true);
});
it ("変数の値が false かどうかを確認する", function() {
hoge = false;
expect(hoge).not.toBe(true);
});
});

用意されている比較用のメソッド

“===” で比較

toBe

1
2
3
4
5
it (" === で比較する", function() {
var hoge = 10;
expect(hoge).toBe(10);
expect(hoge).not.toBe(null);
});

プリミティブ型もしくはオブジェクトの比較

toEqual

1
2
3
4
5
6
7
8
9
it ("リテラルの比較", function() {
var hoge = 10;
expect(hoge).toEqual(10);
});

it ("オブジェクトの比較", function() {
var hoge = {a : 1, b : 2};
var fuga = {a : 1, b : 2};
expect(hoge).toEqual(fuga);
});

正規表現での比較

toMatch

1
2
3
4
5
6
it ("正規表現で比較", function() {
var hoge = "hoge fuga fuga";
expect(hoge).toMatch(/hoge/);
expect(hoge).toMatch("hoge");
expect(hoge).not.toMatch(/moga/);
});

定義されているかの比較

toBeDefined
toBeUndefined

1
2
3
4
5
6
7
8
9
10
it ("定義されているか比較", function(){
var hoge = {a : 1, b : 2};
expect(hoge.a).toBeDefined();
expect(hoge.a).not.toBeUndefined();
});

it ("未定義か比較", function(){
var hoge = {a : 1, b : 2};
expect(hoge.c).not.toBeDefined();
expect(hoge.c).toBeUndefined();
});

null と比較

toBeNull

1
2
3
4
5
6
it ("null か比較", function(){
var hoge = null;
var fuga = 'a';
expect(hoge).toBeNull();
expect(fuga).not.toBeNull();
});

Booleanでの比較

toBeTruthy
toBeFalsy

1
2
3
4
5
6
it ("(!!)での比較", function() {
expect(hoge).toBeTruthy();
});

it ("(!!!)での比較", function() {
expect(hoge).toBeFalsy();
});

値が含まれているかの比較

toContain

1
2
3
4
5
it ("配列に値が含まれているかの比較", function() {
var array = ['hoge', 'fuga', 'moga'];
expect(array).toContain('fuga');
expect(array).not.toContain('saga');
});

数値の比較

toBeLessThan
toBeGeaterThan
toBeCloseTo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
it ("数値が指定の値以下かを比較", function() {
var a = 3.1;
var b = 2.72;
expect(b).toBeLessThan(a);
expect(a).not.toBeLessThan(b);
});

it ("数値が指定の値以上かを比較", function() {
var a = 3.1;
var b = 2.72;
expect(a).toBeGeaterThan(b);
expect(b).not.toBeGeaterThan(a);
});

it ("数値の桁を合わせて比較", function() {
var a = 3.1;
var b = 2.72;
expect(a).toBeCloseTo(b, 0);
expect(a).not.toBeCloseTo(b, 2);
});

NaNかどうか比較

toBeNaN

1
2
3
4
it ("NaNかどうかを比較する", function() {
expect(NaN).toBeNaN();
expect(1).not.toBeNaN();
});

例外かどうか比較

toThrow

1
2
3
4
5
6
7
8
9
10
it("例外を投げるかどうかを比較する", function() {
var hoge = function() {
return 1 + 2;
};
var fuga = function() {
return a + 1;
};
expect(hoge).not.toThrow();
expect(fuga).toThrow();
});

・初期処理と終了処理

テストケースの初期処理と終了処理を実行する場合は、beforeEach と afterEach を使います。
beforeEach と afterEach はそれぞれのテストケースの前後に呼び出されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
describe("テストスイート", function() {
beforeEach(function() {
console.log("初期処理\n");
});
it ("テストケース1", function() {
console.log("テストケース1\n");
});
it ("テストケース2", function() {
console.log("テストケース2\n");
});
afterEach(function(){
console.log("終了処理\n");
});
});

実行結果

初期処理
テストケース1
終了処理
初期処理
テストケース2
終了処理
beforeEach と afterEach をテストスイートの前後で呼び出す場合は
以下のように記述します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
describe("テストスイート外", function() {
beforeEach(function() {
console.log("初期処理\n");
});
afterEach(function(){
console.log("終了処理\n");
});
describe("テストスイート内", function() {
it ("テストケース1", function() {
console.log("テストケース1\n");
});
it ("テストケース2", function() {
console.log("テストケース2\n");
});
});
});

実行結果

初期処理
テストケース1
テストケース2
終了処理

テストのスキップ

1
2
3
4
5
6
7
8
9
10
xdescribe(【ラベル】, 【function】);
xit(【ラベル】, 【function】);
xdescribe("テストスイートのスキップ", function() {
it ("テストケース", function() {
});
});
describe("テストスイート", function() {
xit ("テストケースのスキップ", function() {
});
});

SPY

後日まとめる。
http://pivotal.github.io/jasmine/