たいきゅんの日記

ITエンジニアの積み上げ日記

jestに入門してみた~Matcher編~

今回は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*1.toThrow();
// エラーの型判定
expect*2.toThrow(CustomerError);
// エラーオブジェクトの確認
expect*3.toThrow(new Error('エラー発生'));
// messageプロパティの確認
expect*4.toThrow('エラー発生');
// エラーメッセージの正規表現の確認
expect*5.toThrow(/^エラー.*$/);
})

 

参考

jestjs.io

 

今回はマッチャーについてまとめてみました。

これである程度簡単なテストは書けるようになったのではと思います!

最後まで読んでいただきありがとうございました。

*1:) => throwError(''

*2:) => throwError(''

*3:) => throwError('エラー発生'

*4:) => throwError('エラー発生'

*5:) => throwError('エラー発生'