jestでmockを作成する

に公開

今回はjestのmock関数の「jest.fn()」に関しての基本をまとめていきます。

(1)jest.fn()について

関数に関して、このjest.fn()を利用することで指定した値を返すようなmock関数にすることができます。

今回は例としてMath.randomをmock関数にするケースを考えていきます。

①ランダムにランクを返す関数を作成

export const getRank = () => {
  const rundomNum = Math.floor(Math.random() * 10);
  if(rundomNum >= 8) {
    return 'great';
  } else if(rundomNum >= 4) {
    return 'good';
  } else {
    return 'normal';
  }
};

この関数は本来 "great" "good" "normal"のどれが取得できるかわからない関数であります。

describe('getRank', () => {
  it('Math.randomが0.5の時はgoodが取得できる', () => {

    // Math.randomを0.5を返すmock関数にする
    Math.random() = jest.fn(() => 0.5);

    expect(getRank()).toBe('normal');
  });
});

テストの中でMath.randomに対して常に0.5を返す様にmock化しました。

この結果、getRank()も常に'normal'を返すのが期待できますのでテストが通るようになります。


(2)戻り値を1度だけ固定する方法


(1)ではmock関数の返り値が常に同じになるように設定しましたが、次は1度のみ固定させる方法で考えてみます。

「mockImplementationOnce」を使用する場合
この関数を使用すると指定した返り値が1度のみ適用されます。
Pointとしては
・jest.jn()に対してメソッドチェーンさせる
・引数にコールバック関数を取ります
・複数繋げつことが可能です

describe('getRank', () => {
  it('Math.randomが0.5の時はgoodが取得できる', () => {

    // Math.randomを1回目は0.52回目は0.8を返すmock関数にする
    Math.random() = jest.fn().mockImplementationOnce(() => 0.5).mockImplementationOnce(() => 0.8);

    // 1回目: 0.5が返るので'normal'
    expect(getRank()).toBe('normal');
    // 2回目: 0.8が返るので'great'
    expect(getRank()).toBe('great');
  });
});


となります。

「mockReturnValueOnce」を使用する場合
こちらは先ほどのmockImplementationOnceと同様のことをより簡単に記述することが可能となります。
1点違う点は引数として"値を"直接記述することになります。

describe('getRank', () => {
  it('Math.randomが0.5の時はgoodが取得できる', () => {

    // Math.randomを1回目は0.52回目は0.8を返すmock関数にする
    Math.random() = jest.fn().mockReturnValueOnce(0.5).mockReturnValueOnce(0.8);

    // 1回目: 0.5が返るので'normal'
    expect(getRank()).toBe('normal');
    // 2回目: 0.8が返るので'great'
    expect(getRank()).toBe('great');
  });
});


以上、jestのjest.fnの基本のメモです。