最近はテストを書くときはほとんどJestを使っています。今回は、v19から導入されたspyonを使ってconsole.logをモックするやり方を見ていきます。
まずは、プロジェクトの準備します。
$ yarn init -y
$ yarn add --dev jest jest-cli
test環境にFlowtypeを導入します。自分はflow-typedはglobal環境に入れているので、適宜置き換えるといいでしょう。
$ yarn add --dev flow-bin
$ yarn run flow init
$ flow-typed install jest@20
$ yarn run jest -- --watch
jest --watch
でコードを監視します。はじめは対象がないので、以下のような表示になります。
test.jsを作成し、コードを書いていきます。
// @flow
const sum = (a, b) => a + btest('sum', () => {
expect(sum(1, 2)).toBe(3)
})
よさそうです。
さて、 printSum
関数をつくってみます。これは上記の sum
関数を出力する関数です。
const printSum = (a, b) => {
console.log(`sum = ${sum(a, b)}`)
}
ここで、console.logが呼ばれているかテストするには jest.spyOn
を使います。
jest.spyOn(console, 'log')test('printSum', () => {
printSum(1, 2)
expect(console.log).toBeCalled()
})
よさそうです。しかし、console.logの結果が残っています。これは、mockObj.mockImplementation(() => customImplementation)
かobject[methodName] = jest.fn(() => customImplementation)
を使うことで上書きできます。
const spyLog = jest.spyOn(console, 'log')
spyLog.mockImplementation(x => x)test('printSum', () => {
printSum(1, 2)
expect(console.log).toBeCalled()
})
また、jest.spyOn
の戻り値はモック関数なので出力を確認できます。
test('printSum', () => {
printSum(1, 2)
expect(console.log).toBeCalled()
expect(spyLog.mock.calls[0][0]).toEqual('sum = 3')
}
最後に、mock関数のリセットを忘れないようにします。全体としては以下のようになります。