Jestでconsole.logをモックする

赤芽
4 min readAug 14, 2017

--

最近はテストを書くときはほとんど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 + b
test('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関数のリセットを忘れないようにします。全体としては以下のようになります。

--

--