【Jest】Matcher(マッチャー)の種類と特徴をわかりやすく解説!

この記事では『Matcher(マッチャー)』について

  • Matcher(マッチャー)とは
  • Matcher(マッチャー)の種類
  • 各Matcherの特徴

などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。

Matcher(マッチャー)とは

Matcher(マッチャー)はテスト結果を検証するためのメソッドです。

JestではMatcherを使用して、テストの実行結果と期待値を比較することで、テストの成功や失敗を判定することができます。

MatcherにはtoBetoEqualなど様々な種類があります。後ほど「Matcherの種類とその特徴」について詳しく説明しますが、一例として、以下に示すようなtoBeというMatcherを用いたテストコードを見てみましょう。

test('2 + 3 が 5 になるか', () => {
    expect(2 + 3).toBe(5);
});

上記のコードでは、「2+3(テストの実行結果)」が「5(期待値)」と等しくなるかを判定しています。

このように、JestではMatcherを使用して様々なテストをすることができます。

なお、判定を否定する場合には、Matcherの前にnotを付けます。

test('2 + 3 が 4 にならないか', () => {
    expect(2 + 3).not.toBe(4);
});

上記のコードでは、「2+3(テストの実行結果)」が「4(期待値)」と等しくならないかを判定しています。

Matcher(マッチャー)の種類

以下の表にMatcherの種類についてまとめました。

Matcher特徴
toBe(value)「string/number/boolean等のプリミティブ型の値の判定」と「オブジェクトや配列の参照先の判定」に使用するMatcher。
toEqual(value)オブジェクトや配列の判定に使用するMatcher。
toStrictEqual(value)オブジェクトや配列の判定に使用するMatcher。
toEqual(value)よりも厳密に値の比較を行う。
toBeTruthy()truthy(真値)の判定に使用するMatcher。
toBeFalsy()falsy(偽値)の判定に使用するMatcher。
toBeNull()nullの判定に使用するMatcher。
toBeUndefined()undefinedの判定に使用するMatcher。
toBeDefined()toBeUndefined()の反対。
toBeNaN()NaNの判定に使用するMatcher。
toMatch(regexp | string)文字列に対して正規表現でマッチするかを判定するMatcher。
toHaveLength(number)配列や文字列の長さがnumberかを判定するMatcher。
toContain(item)配列に特定の要素が含まれているかを判定するMatcher。
参照先が異なると判定不可。
toContainEqual(item)配列に特定の要素が含まれているかを判定するMatcher。
参照先が異なっていても判定が可能。
toHaveProperty(keyPath[, value])オブジェクトにkeyPathのプロパティが含まれているかを判定するMatcher。
toBeGreaterThan(number)numberより大きいかを判定するMatcher。
toBeGreaterThanOrEqual(number)number以上かを判定するMatcher。
toBeLessThan(number)numberより小さいかを判定するMatcher。
toBeLessThanOrEqual(number)number以下かを判定するMatcher。
toBeCloseTo(number[, numDigits])浮動小数点の値が同一であるかを判定するMatcher。
toThrow([error])例外が発生したかを判定するMatcher。
toThrowError([error])例外が発生したかを判定するMatcher。
toHaveBeenCalled()関数やメソッドが呼ばれたかを判定するMatcher。
toHaveBeenCalledTimes(number)関数やメソッドがnumber回呼ばれたかを判定するMatcher。
toHaveBeenCalledWith(arg1, arg2, …)関数やメソッドが引数arg1arg2で呼ばれたかを判定するMatcher。

ではそれから各Matcherの特徴についてプログラム例も用いて詳しく説明します。

toBe

toBe(value)「string/number/boolean等のプリミティブ型の値の判定」と「オブジェクトや配列の参照先の判定」に使用するMatcherです。toBe(value)Object.isを使用して厳密な等価性をテストしています。

Object. isとは

大まかに説明すると、Object.isは「strict equality(===)」からNaN, -0, +0に対する特別な処理を除いたものです。

例えば、NaNNaNの比較は、「===」ではfalseを返しますが、「Object.is」ではtrueを返します。また、+0-0の比較は、「===」ではtrueを返しますが、「Object.is」ではfalseを返します。

// ★NaN, -0, +0に対する特別な処理
// NaN同士の比較はfalse
NaN == NaN      //false
NaN === NaN     //false
// -0, +0の比較はtrue
-0 == +0        //true
-0 === +0       //true

// ★これらの特別な処理を除いたのが「Object.is」
Object.is(NaN, NaN) //true
Object.is(-0, +0)   //false

テストにおいては、同じ値を比較したいので、「strict equality(===)」よりも「Object.is」の方が使いやすいです。

toBeを用いたテストコード

toBe(value)を用いたテストコードを以下に示します。

test('toBeのテスト(プリミティブ値の比較)', () => {
    expect('hoge').toBe('hoge');
    expect(2 + 3).toBe(5);
    expect(true).toBe(true);
});

test('toBeのテスト(オブジェクトと配列の参照先の比較)', () => {
    const obj = { key: 'value' };
    const anotherObj = { key: 'value' };

    const arr = [1, 2, 3];
    const anotherArr = [1, 2, 3];

    // 同じ参照先の場合
    expect(obj).toBe(obj);
    expect(anotherObj).toBe(anotherObj);
    expect(arr).toBe(arr);
    expect(anotherArr).toBe(anotherArr);

    // 同じ値だが、参照先が異なる場合はテスト判定不可
    expect(obj).not.toBe(anotherObj);
    expect(obj).not.toBe({ key: 'value' });
    expect(obj).not.toBe({ ...obj });
    expect(arr).not.toBe(anotherArr);
    expect(arr).not.toBe([1, 2, 3]);
});

toEqualとtoStrictEqual

toEqual(value)toStrictEqual(value)は、オブジェクトや配列の判定に使用するMatcherです。toBe(value)とは異なり、参照先が異なっていても判定可能です。

toEqualとtoStrictEqualの違い

toStrictEqual(value)toEqual(value)よりも厳密に値の比較を行っています。toEqual(value)に対して、以下の2点に違いがあります。

  • undefinedが指定されているプロパティも等価であるかチェックする
  • インスタンスの生成元クラスが同じであるかもチェックする

このように、toStrictEqual(value)は厳密な判定をしているので、厳密性が求められる時には、toStrictEqual(value)を使うことをおすすめします。

toEqualとtoStrictEqualを用いたテストコード

toEqual(value)toStrictEqual(value)を用いたテストコードを以下に示します。

test('toEqualとtoStrictEqualのテスト', () => {
    const obj = { key: 'value' };
    const anotherObj = { key: 'value' };

    const arr = [1, 2, 3];
    const anotherArr = [1, 2, 3];

    // 同じ値だが、参照先が異なる場合でも判定可能!!
    expect(obj).toEqual(anotherObj);
    expect(obj).toEqual({ key: 'value' });
    expect(obj).toEqual({ ...obj });
    expect(arr).toEqual(anotherArr);
    expect(arr).toEqual([1, 2, 3]);

    expect(obj).toStrictEqual(anotherObj);
    expect(obj).toStrictEqual({ key: 'value' });
    expect(obj).toStrictEqual({ ...obj });
    expect(arr).toStrictEqual(anotherArr);
    expect(arr).toStrictEqual([1, 2, 3]);
});

test('toEqualとtoStrictEqualの違い', () => {
    const obj = { key: 'value' };
    const arr = [1, 2, 3];

    // undefinedの扱い方が異なる
    expect(obj).toEqual({ key: 'value', hoge: undefined });
    expect(obj).not.toStrictEqual({ key: 'value', hoge: undefined });
    expect(arr).toEqual([1, 2, 3, undefined]);
    expect(arr).not.toStrictEqual([1, 2, 3, undefined]);

    // インスタンスの生成元クラス(ClassA)
    class ClassA {
        key = 'value';
    }

    //クラス(ClassA)をインスタンス化
    const objFromClassA = new ClassA();

    // インスタンスの生成元クラスによる判定が異なる
    expect(obj).toEqual(objFromClassA);
    expect(obj).not.toStrictEqual(objFromClassA);
});

toBeTruthyとtoBeFalsy

toBeTruthy()toBeFalsy()JavaScriptのtruthy(真値)とfalsy(偽値)の判定に使用するMatcherです。

falsy(フォルシー)はfalseと見なされる値です。「false, 0, +0, -0, 0n, 空文字(“”or‘’), null, undefined, NaN」がfalsyと定義されています。

一方、truthy(トゥルーシー)はtrueと見なされる値です。falsyとして定義された値以外がtruthyになります。

toBeTruthy()toBeFalsy()はboolean型の値判定ではありません。厳密にboolean型のtrueとfalseを判定したい場合には、toBe(true)toBe(false)を使用しましょう。

toBeTruthyとtoBeFalsyを用いたテストコード

toBeTruthy()toBeFalsy()を用いたテストコードを以下に示します。

test('toBeTruthyとtoBeFalsyのテスト', () => {
    expect(true).toBeTruthy();      //trueはtruthy
    expect(false).toBeFalsy();      //falseはfalsy

    //falsyとして定義されている値
    expect(0).toBeFalsy();
    expect(-0).toBeFalsy();
    expect(+0).toBeFalsy();
    expect(0n).toBeFalsy();
    expect("").toBeFalsy();
    expect('').toBeFalsy();
    expect(null).toBeFalsy();
    expect(undefined).toBeFalsy();
    expect(NaN).toBeFalsy();

    //Falsyとして定義された値以外はtruthy
    expect(1).toBeTruthy();             //0以外の数字はtruthy
    expect('hoge').toBeTruthy();        //空文字以外はtruthy
    expect({}).toBeTruthy();            //オブジェクトはtruthy
    expect([]).toBeTruthy();            //配列はtruthy
});

toBeNull

toBeNull()nullの判定に使用するMatcherです。

toBe(null)でも同じように判定することができますが、toBeNull()を用いた方が、テストが失敗した時のメッセージが分かりやすいです。

toBeNullを用いたテストコード

toBeNull()を用いたテストコードを以下に示します。

test('toBeNullのテスト', () => {
    expect(null).toBeNull();
    expect('hoge').not.toBeNull();        //文字列はnullではない
    expect(undefined).not.toBeNull();     //undefinedはnullではない
    expect(NaN).not.toBeNull();           //NaNはnullではない
});

toBeNullを用いたテストコード(テストが失敗した時)

toBeNull()の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toBeNullのテスト(テストが失敗した場合)', () => {
    expect('hoge').toBeNull();     //文字列はnullではないがnullであるかをテストしている
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toBeNullのテスト(テストが失敗した場合) (3 ms)

  ● toBeNullのテスト(テストが失敗した場合)

    expect(received).toBeNull()

    Received: "hoge"

      110 |
      111 | test('toBeNullのテスト(テストが失敗した場合)', () => {
    > 112 |     expect('hoge').toBeNull();     //文字列はnullではないがnullであるかをテストしている
          |                    ^
      113 | });

      at Object.toBeNull (matcher.test.js:112:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.502 s, estimated 1 s
Ran all test suites.

toBe(null)の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toBeのテスト(テストが失敗した場合)', () => {
    expect('hoge').toBe(null);     //文字列はnullではないがnullであるかをテストしている
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toBeのテスト(テストが失敗した場合) (4 ms)

  ● toBeのテスト(テストが失敗した場合)

    expect(received).toBe(expected) // Object.is equality

    Expected: null
    Received: "hoge"

      110 |
      111 | test('toBeのテスト(テストが失敗した場合)', () => {
    > 112 |     expect('hoge').toBe(null);     //文字列はnullではないがnullであるかをテストしている
          |                    ^
      113 | });

      at Object.toBe (matcher.test.js:112:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.626 s
Ran all test suites.

toBeUndefinedとtoBeDefined

toBeUndefined()undefinedの判定に使用するMatcherです。一方、toBeDefined()toBeUndefined()の反対です。

言い換えると、toBeUndefined()not.toBeDefined()と同じです。同様に、toBeDefined()not.toBeUndefined()と同じです。

toBe(undefined)でも同じように判定することができますが、toBeUndefined()を用いた方が、テストが失敗した時のメッセージが分かりやすいです。

toBeUndefinedとtoBeDefinedを用いたテストコード

toBeUndefined()toBeDefined()を用いたテストコードを以下に示します。

test('toBeUndefinedとtoBeDefinedのテスト', () => {
    expect(undefined).toBeUndefined();
    expect(undefined).not.toBeDefined();

    // 文字列はundefinedではない
    expect('hoge').not.toBeUndefined();
    expect('hoge').toBeDefined();

    // nullはundefinedではない
    expect(null).not.toBeUndefined();
    expect(null).toBeDefined();

    // NaNはundefinedではない
    expect(NaN).not.toBeUndefined();
    expect(NaN).toBeDefined();
});

toBeUndefinedを用いたテストコード(テストが失敗した時)

toBeUndefined()の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toBeUndefinedのテスト(テストが失敗した場合)', () => {
    expect('hoge').toBeUndefined();     //文字列はundefinedではないがundefinedであるかをテストしている
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toBeUndefinedのテスト(テストが失敗した場合) (2 ms)

  ● toBeUndefinedのテスト(テストが失敗した場合)

    expect(received).toBeUndefined()

    Received: "hoge"

      126 |
      127 | test('toBeUndefinedのテスト(テストが失敗した場合)', () => {
    > 128 |     expect('hoge').toBeUndefined();     //文字列はundefinedではないがundefinedであるかをテストしている
          |                    ^
      129 | });

      at Object.toBeUndefined (matcher.test.js:128:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.47 s, estimated 1 s
Ran all test suites.

toBe(undefined)の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toBeのテスト(テストが失敗した場合)', () => {
    expect('hoge').toBe(undefined);     //文字列はundefinedではないがundefinedであるかをテストしている
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toBeのテスト(テストが失敗した場合) (4 ms)

  ● toBeのテスト(テストが失敗した場合)

    expect(received).toBe(expected) // Object.is equality

    Expected: undefined
    Received: "hoge"

      126 |
      127 | test('toBeのテスト(テストが失敗した場合)', () => {
    > 128 |     expect('hoge').toBe(undefined);     //文字列はundefinedではないがundefinedであるかをテストしている
          |                    ^
      129 | });

      at Object.toBe (matcher.test.js:128:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.475 s, estimated 1 s
Ran all test suites.

toBeNaN

toBeNaN()NaNの判定に使用するMatcherです。

toBe(NaN)でも同じように判定することができますが、toBeNaN()を用いた方が、テストが失敗した時のメッセージが分かりやすいです。

toBeNaNを用いたテストコード

toBeNaN()を用いたテストコードを以下に示します。

test('toBeNaNのテスト', () => {
    expect(NaN).toBeNaN();
    expect('hoge').not.toBeNaN();        //文字列はNaNではない
    expect(undefined).not.toBeNaN();     //undefinedはNaNではない
    expect(null).not.toBeNaN();          //NaNはNaNではない
});

toBeNaNを用いたテストコード(テストが失敗した時)

toBeNaN()の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toBeNaNのテスト(テストが失敗した場合)', () => {
    expect('hoge').toBeNaN();     //文字列はNaNではないがNaNであるかをテストしている
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toBeNaNのテスト(テストが失敗した場合) (2 ms)

  ● toBeNaNのテスト(テストが失敗した場合)

    expect(received).toBeNaN()

    Received: "hoge"

      133 |
      134 | test('toBeNaNのテスト(テストが失敗した場合)', () => {
    > 135 |     expect('hoge').toBeNaN();     //文字列はNaNではないがNaNであるかをテストしている
          |                    ^
      136 | });
      137 |

      at Object.toBeNaN (matcher.test.js:135:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.473 s, estimated 1 s
Ran all test suites.

toBe(NaN)の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toBeのテスト(テストが失敗した場合)', () => {
    expect('hoge').toBe(NaN);     //文字列はNaNではないがNaNであるかをテストしている
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toBeのテスト(テストが失敗した場合) (3 ms)

  ● toBeのテスト(テストが失敗した場合)

    expect(received).toBe(expected) // Object.is equality

    Expected: NaN
    Received: "hoge"

      133 |
      134 | test('toBeのテスト(テストが失敗した場合)', () => {
    > 135 |     expect('hoge').toBe(NaN);     //文字列はNaNではないがNaNであるかをテストしている
          |                    ^
      136 | });
      137 |

      at Object.toBe (matcher.test.js:135:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.482 s, estimated 1 s
Ran all test suites.

toMatch

toMatch(regexp | string)文字列に対して正規表現でマッチするかを判定するMatcherです。toMatch(regexp | string)正規表現(regexp)だけでなく、文字列(string)も引数に指定可能です。

toMatchを用いたテストコード

toMatch(regexp | string)を用いたテストコードを以下に示します。

test('toMatchのテスト', () => {
    expect('HogeHoge Test').toMatch(/Hoge/);        //文字列「HogeHoge Test」に「Hoge」が含まれているか
    expect('HogeHoge Test').not.toMatch(/Foo/);     //文字列「HogeHoge Test」に「Foo」が含まれていないか
    expect('HogeHoge Test').toMatch('Hoge');        //文字列「HogeHoge Test」に「Hoge」が含まれているか
    expect('HogeHoge Test').not.toMatch('Foo');     //文字列「HogeHoge Test」に「Foo」が含まれていないか
});

toHaveLength

toHaveLength(number)配列や文字列の長さがnumberかを判定するMatcherです。

lengthプロパティを使っても判定できますが、toHaveLength(number)を使った方が読みやすいです。

toHaveLengthを用いたテストコード

toHaveLength(number)を用いたテストコードを以下に示します。

test('toHaveLengthのテスト', () => {
    const arr = [1, 2, 3];
    const str = 'hoge';

    // arrの長さは「3」か
    expect(arr).toHaveLength(3);
    expect(arr.length).toBe(3);

    // strの長さは「4」か
    expect(str).toHaveLength(4);
    expect(str.length).toBe(4);
});

toContainとtoContainEqual

toContain(item)toContainEqual(item)配列に特定の要素が含まれているかを判定するMatcherです。

toContainとtoContainEqualの違い

toContainEqual(item)toContain(item)と異なり、参照先が異なっていても判定が可能です。

toContainとtoContainEqualを用いたテストコード

toContain(item)toContainEqual(item)を用いたテストコードを以下に示します。

test('toContainとtoContainEqualのテスト', () => {
    const obj = { key: 'value' };
    const arr = [obj, { hoge: 'foo' }];

    // 同じ参照先の場合
    expect(arr).toContain(obj);                     //配列arrにobjが含まれているか
    expect(arr).toContainEqual(obj);                //配列arrにobjが含まれているか

    // 同じ値だが、参照先が異なる場合
    expect(arr).not.toContain({ key: 'value' });    //配列arrに{ key: 'value' }が含まれているか
    expect(arr).toContainEqual({ key: 'value' });   //配列arrに{ key: 'value' }が含まれているか
});

toHaveProperty

toHaveProperty(keyPath[, value])オブジェクトにkeyPathのプロパティが含まれているかを判定するMatcherです。オプション引数にvalueを指定すると、受け取ったプロパティの値も判定することができるようになります。

toEqual(value)でも同じように判定することができますが、toHaveProperty(keyPath[, value])を用いた方が、テストが失敗した時のメッセージが分かりやすいです。

toHavePropertyを用いたテストコード

toHaveProperty(keyPath[, value])を用いたテストコードを以下に示します。

test('toHavePropertyのテスト', () => {
    const obj = { key: 'value' };

    expect(obj).toHaveProperty('key');           //オブジェクトobjのプロパティにkeyが含まれているか
    expect(obj).toHaveProperty('key', 'value');  //オブジェクトobjのプロパティにkeyが含まれていて、その値は'value'であるか
});

toHavePropertyを用いたテストコード(テストが失敗した時)

toHaveProperty(keyPath[, value])の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toHavePropertyのテスト(テストが失敗した場合)', () => {
    const obj = { key: 'value' };

    expect(obj).toHaveProperty('key', 'hoge');          //オブジェクトobjのプロパティにkeyが含まれていて、その値は'hoge'であるか
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toHavePropertyのテスト(テストが失敗した場合) (5 ms)

  ● toHavePropertyのテスト(テストが失敗した場合)

    expect(received).toHaveProperty(path, value)

    Expected path: "key"

    Expected value: "hoge"
    Received value: "value"

      176 |     const obj = { key: 'value' };
      177 |
    > 178 |     expect(obj).toHaveProperty('key', 'hoge');          //オブジェクトobjのプロパティにkeyが含まれていて、その値は'hoge'であるか
          |                 ^
      179 | });

      at Object.toHaveProperty (matcher.test.js:178:17)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.471 s, estimated 1 s
Ran all test suites.

toEqual(value)の場合

テストコードを以下のように書いて、テストを失敗させます。

test('toEqualのテスト(テストが失敗した場合)', () => {
    const obj = { key: 'value' };

    expect(obj.key).toEqual('hoge');          //オブジェクトobjのプロパティkeyの値は'hoge'であるか
});

実行結果は以下の様になります。

PS C:\Users\user01\Desktop\matcherTest> npm test

> jesttest@1.0.0 test
> jest

 FAIL  ./matcher.test.js
  × toEqualのテスト(テストが失敗した場合) (5 ms)

  ● toEqualのテスト(テストが失敗した場合)

    expect(received).toEqual(expected) // deep equality

    Expected: "hoge"
    Received: "value"

      176 |     const obj = { key: 'value' };
      177 |
    > 178 |     expect(obj.key).toEqual('hoge');          //オブジェクトobjのプロパティkeyの値は'hoge'であるか
          |                     ^
      179 | });

      at Object.toEqual (matcher.test.js:178:21)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.48 s, estimated 1 s
Ran all test suites.

toBeGreaterThanとtoBeGreaterThanOrEqual

toBeGreaterThan(number)numberより大きいかを判定するMatcherです。「~より大きい」なので、「number」は含まれません。

toBeGreaterThanOrEqual(number)number以上かを判定するMatcherです。「~以上」なので、「number」の数は含まれます。

toBeGreaterThanとtoBeGreaterThanOrEqualを用いたテストコード

toBeGreaterThan(number)toBeGreaterThanOrEqual(number)を用いたテストコードを以下に示します。

test('toBeGreaterThanとtoBeGreaterThanOrEqualのテスト', () => {
    const value = 12;

    expect(value).toBeGreaterThan(10);          //「12」は「10」よりも大きいか
    expect(value).not.toBeGreaterThan(12);      //「12」は「12」よりも大きくないか

    expect(value).toBeGreaterThanOrEqual(10);   //「12」は「10」以上か
    expect(value).toBeGreaterThanOrEqual(12);   //「12」は「12」以上か
});

toBeLessThanとtoBeLessThanOrEqual

toBeLessThan(number)numberより小さいかを判定するMatcherです。「~より小さい」なので、「number」は含まれません。

toBeLessThanOrEqual(number)number以下かを判定するMatcherです。「~以下」なので、「number」の数は含まれます。

toBeLessThanとtoBeLessThanOrEqualを用いたテストコード

toBeLessThan(number)toBeLessThanOrEqual(number)を用いたテストコードを以下に示します。

test('toBeLessThanとtoBeLessThanOrEqualのテスト', () => {
    const value = 12;

    expect(value).toBeLessThan(15);          //「12」は「15」よりも小さいか
    expect(value).not.toBeLessThan(12);      //「12」は「12」よりも小さくないか

    expect(value).toBeLessThanOrEqual(15);   //「12」は「15」以下か
    expect(value).toBeLessThanOrEqual(12);   //「12」は「12」以下か
});

toBeCloseTo

toBeCloseTo(number[, numDigits])浮動小数点の値が同一であるかを判定するMatcherです。

オプションのnumDigitsは小数点以下のチェックする桁数を指定します。指定しなければ、デフォルト値の「2」となります。

toBeCloseToを用いたテストコード

toBeCloseTo(number[, numDigits])を用いたテストコードを以下に示します。

test('toBeCloseToのテスト', () => {
    const value = 0.1 + 0.2;

    expect(value).not.toBe(0.3);               //丸め誤差が原因で期待通りに動作しない
    expect(value).toBeCloseTo(0.3);            //valueと0.3を比較して、2桁(デフォルト)の制度まで等しいとテスト合格
    expect(value).toBeCloseTo(0.3, 5);         //valueと0.3を比較して、5桁の制度まで等しいとテスト合格
});

JavaScriptでは0.2+0.1は0.30000000000000004なので、toBe(value)で比較するとテストが失敗します。

toThrowとtoThrowError

toThrow([error])toThrowError([error])はどちらも例外が発生したかを判定するMatcherです。

引数を省略すると、例外が発生したかのみを判定します。引数には「例外の型」、「エラーメッセージ」、「Errorオブジェクト」などを指定することができます。

toThrowとtoThrowErrorを用いたテストコード

toThrow([error])toThrowError([error])を用いたテストコードを以下に示します。

class CustomError extends Error { }
function throwCustomError() {
    throw new CustomError('エラーが発生しました')
}

test('toThrowとtoThrowErrorのテスト', () => {
    // 例外が発生したかのみを判定
    // どの書き方でもOK
    expect(throwCustomError).toThrow();
    expect(throwCustomError).toThrowError();
    expect(() => throwCustomError()).toThrow();
    expect(() => throwCustomError()).toThrowError();

    // 例外の型を判定(引数に「例外の型」を指定)
    // どの書き方でもOK
    expect(throwCustomError).toThrow(CustomError);
    expect(throwCustomError).toThrowError(CustomError);
    expect(() => throwCustomError()).toThrow(CustomError);
    expect(() => throwCustomError()).toThrowError(CustomError);

    // エラーメッセージの判定(引数に「エラーメッセージ」や「Errorオブジェクト」を指定)
    // どの書き方でもOK
    expect(throwCustomError).toThrow('エラーが発生しました');
    expect(throwCustomError).toThrowError('エラーが発生しました');
    expect(throwCustomError).toThrow(new CustomError('エラーが発生しました'));
    expect(throwCustomError).toThrowError(new CustomError('エラーが発生しました'));
    expect(() => throwCustomError()).toThrow('エラーが発生しました');
    expect(() => throwCustomError()).toThrowError('エラーが発生しました');
    expect(() => throwCustomError()).toThrow(new CustomError('エラーが発生しました'));
    expect(() => throwCustomError()).toThrowError(new CustomError('エラーが発生しました'));

    // エラーメッセージのどこかで「エラー」と書かれているかを判定
    // どの書き方でもOK
    expect(throwCustomError).toThrow(/エラー/);
    expect(throwCustomError).toThrowError(/エラー/);
    expect(throwCustomError).toThrow('エラー');
    expect(throwCustomError).toThrowError('エラー');
    expect(() => throwCustomError()).toThrow(/エラー/);
    expect(() => throwCustomError()).toThrowError(/エラー/);
    expect(() => throwCustomError()).toThrow('エラー');
    expect(() => throwCustomError()).toThrowError('エラー');
});

本記事のまとめ

この記事では『Matcher(マッチャー)』について、以下の内容を説明しました。

  • Matcher(マッチャー)とは
  • Matcher(マッチャー)の種類
  • 各Matcherの特徴

お読み頂きありがとうございました。