今回はjest入門~Matcher編~としてmatcher(マッチャー)についてまとめてみます!
環境構築 - 最初のテストまで編の続きとなりますので、環境構築はこちらを参考にしてみてください。(Vue3+Dockerで環境構築しております。)
URL...
Matcher(マッチャー)とは
マッチャーとは、「テストの評価条件を定義するメソッド」のことです。
マッチするかどうか?の確認をすることを確認するメソッド群と捉えて差し支えないと思います。
主なMatcher
toHaveBeenCalled
モック関数が呼ばれたかどうかを確認するマッチャー。
// マッチャー
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
mockFunc(1);
expect(mockFunc).toHaveBeenCalled();
});
toBe
等価であることを確認するマッチャー。
test('two plus two is four', () => {
expect(2 + 2).toBe(4);
})
toHaveBeenCalledTimes
モック関数が期待した回数だけ呼ばれたことを確認するマッチャー。
import fooBar from "@/fooBar";
test('部分モック', () => {
const spy = jest.spyOn(fooBar, 'foo').mockReturnValue('mock');
expect(spy).toHaveBeenCalledTimes(1);
})
toHaveBeenLastCalledWith
最後に呼び出された関数に渡された引数をチェックすることができるマッチャー。
第一引数 想定される値
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
// 2回呼出
mockFunc(1);
mockFunc(2);
expect(mockFunc).toHaveBeenLastCalledWith(2); // 最後の呼出の引数
});
toHaveReturned
モック関数が少なくとも1回正常に返された(エラーをスローしなかった)ことをテストできるマッチャー
// マッチャー
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
// 2回呼出
mockFunc(1);
mockFunc(2);
expect(mockFunc).toHaveReturned();
});
toHaveReturnedTimes
モック関数が指定した回数だけ正常に実行された(エラーをスローしなかった)ことをテストできるマッチャー。
第一引数 number
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
// 2回呼出
mockFunc(1);
mockFunc(2);
expect(mockFunc).toHaveReturnedTimes(2);
});
toHaveNthReturnedWith
モック関数がn回目に返した値が特定の値であるかどうかをテストするマッチャー。
// マッチャー
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
// 2回呼出
mockFunc(1);
mockFunc(2);
expect(mockFunc).toHaveNthReturnedWith(1, 100); // 1回目の戻り値
});
toHaveLastReturnedWith
モック関数が最後に返した値が特定の値であるかテストするマッチャー。
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
// 2回呼出
mockFunc(1);
mockFunc(2);
expect(mockFunc).toHaveLastReturnedWith(100);
});
toMatchSnapshot
スナップショットと一致することを確認するマッチャー
モックの全呼び出しの引数・戻り値が前回実行時から変わっていないことをテストする。
// マッチャー
test("モック用のマッチャー", () => {
const mockFunc = jest.fn().mockReturnValue(100);
// 2回呼出
mockFunc(1);
mockFunc(2);
expect(mockFunc).toMatchSnapshot();
});
toEqual
toStrictEqual
オブジェクト・配列の等価チェックができる。両者の違いは、undefinedの扱い方。
toStrictEqual
の方がより厳密に判定できる
test('expect.toEqual/toStrictEqual', () => {
expect({foo: 'var'}).toEqual({foo: 'var'});
expect({foo: 'var'}).toStrictEqual({foo: 'var'});
expect([1, 2, 3]).toEqual([1,2,3]);
expect([1,2,3]).toStrictEqual([1,2,3]);
})
toBeTruthy
toBeFalsy
true falseの判定を行うマッチャー。文字列やオブジェクト型でも判定ができるのが特徴。
test('toBeTruthy/toBeFalsy', () => {
expect(true).toBeTruthy();
expect(false).toBeFalsy();
// 空文字以外Truthy
expect('foo').toBeTruthy();
// 空文字以外Truthy
expect(1).toBeTruthy();
// 配列はTruthy
expect([]).toBeTruthy();
// オブジェクトはTruthy
expect({}).toBeTruthy();
// undefines/nullはFalty
expect(undefined).toBeFalsy();
// 0はFalty
expect(0).toBeFalsy();
// 空文字はFalty
expect('').toBeFalsy();
});
undefined null
undefined nullの判定を行うマッチャー。判定は下記の通り。
test('toBeUndefined/toBeNull/toBeDfined', () => {
expect(undefined).toBeUndefined();
expect('foo').toBeDefined();
// nullはundefinedではない
expect(null).toBeDefined();
expect(null).toBeNull();
expect('foo').not.toBeNull();
// undefinedはnullではない
expect(undefined).not.toBeNull();
});
配列長・文字列長
toHaveLengthマッチャーを使用。
配列や文字列数の判定を行うマッチャー。配列の場合は要素数をカウントしてくれる。
test('toHaveLength', () => {
expect('foo').toHaveLength(3);
expect([1,2,3]).toHaveLength(3);
})
toMatchマッチャーを使用する。
文字列を正規表現で判定するマッチャー。
test('toMatch', () => {
expect('foo12345').toMatch(/foo\d{5}/)
expect('foo12345').toMatch(/^foo\d{5}$/)
// 部分一致
expect('foo12345').toMatch("foo")
})
配列要素
toContain toContainEqualマッチャーを使用する。
配列要素がプリミティブ型はtoContain
を使用し、配列要素がオブジェクト型の場合はtoContainEqual
を使用する。
test('toContain/toContainEqual', () => {
// プリミティブ値
expect(['foo', 'bar']).toContain('foo');
// オブジェクト型
expect([{ foo: 'bar' }, {foo: 'hoge'}]).toContainEqual({ foo:'bar' })
});
例外処理
toThrowマッチャーを使用する
。引数にはテスト対象のメソッドを関数でラップ。
引数を省略するとエラーが検出されたことのみチェックする。
引数には型・オブジェクト・messageの値を指定できる。
// エラーになることを検証
// エラーの型判定
expect*2.toThrow(CustomerError);
// エラーオブジェクトの確認
expect*3.toThrow(new Error('エラー発生'));
// messageプロパティの確認
expect*4.toThrow('エラー発生');
expect*5.toThrow(/^エラー.*$/);
})
参考
jestjs.io
今回はマッチャーについてまとめてみました。
これである程度簡単なテストは書けるようになったのではと思います!
最後まで読んでいただきありがとうございました。