Jest モックを使ってより柔軟なテストをしてみよう

例えば以下のような関数を作成したとします。

const doTamibouz = (callback, name) => {
  if(name === 'tamibouz') callback(name)
}

この関数では、第二引数の文字列が tamibouz だった時だけ、第一引数の関数を実行しています。

この関数の動作をテストしたいとします。

具体的には、第二引数の name が tamibouz だったら第一引数の関数が実行されて、そうでない場合は実行されない、ということをテストします。

この関数では戻り値がないため、戻り値をチェックするようなテストコードはかけません。

第一引数のcallbackが実行されたかどうかをチェックしたい場合は、モックを使います。

モックを使うことで、関数が呼び出されたかどうかや、関数が呼び出されたときの引数をチェックすることができます。

テストコードは以下のようになります。

describe('doTamibouz', () => {
  test('実行する', () => {
    const mockFn = jest.fn()
    doTamibouz(mockFn, 'tamibouz')
    expect(mockFn).toHaveBeenCalled()
  })
  test('実行しない', () => {
    const mockFn = jest.fn()
    doTamibouz(mockFn, 'hitochan')
    expect(mockFn).not.toHaveBeenCalled()
  })
})

const mockFn = jest.fn() の部分がモックの作成を行っています。

作成されたモック関数は、呼び出されたかどうかや関数の引数をチェックすることができます。

toHaveBeenCalled は、expect に渡されたモック関数が実行されたかどうかを判定します。