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.5を2回目は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.5を2回目は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の基本のメモです。