『ハンズオンNode.js』Jestまとめ

2023/08/23に公開

Jestによるテストコードの構造

  • Jestの特徴
    • テストを並列に実行するため高速。
    • フルスタックのため、設定や実行手順が少なく済む。
  • フック
    • beforeAll()
    • beforeEach()
    • AfterAll()
    • AfterEach()
    • これらは、describeの外に書いた場合、ファイル内の全テストケースに対して機能する。

非同期処理のテスト

describe('fs.promises', () => {
  describe('writeFile', () => {
    it('エラーなしで実行できる', async () => {
      await fs.promises.writeFile('hello.txt', 'Hello World')
    })
  })
})

アサーション

expect(obj.foo).toBe('foo')
expect(obj).toEqual({ foo: 'foo', bar: 1 })

設定の記述

  • package.json"jest"というフィールドを作り、設定していくことができる。
    • その他の方法として、jest.config.jsで設定を書くこともできる。
  • 以下の設定をすることで、テストコードの中で明示的に「元に戻す」処理を実行する必要がなくなる。
    • "clearMocks": true
      • テストの実行ごとにテストダブルの実行履歴をリセットするための設定。
    • "restoreMocks": true
      • 実行履歴のリセット+テスト用に指定した実装を解除し、関数のオリジナルの実装に戻すための設定。
      • jest.spyOn()で生成されたテストダブルにのみ適用される。

テストダブル

  • Jestでは、ひとまとめにモックと呼ばれている。
    • スパイ、スタブ、モックの分類を明確に区別していない。
  • jest.spyOn()
    • 既存の関数に対するモックを生成する。
  • jest.mock()
    • モジュールに対してモックを生成する。
  • jest.fn()
    • オリジナルの実装がないモックを生成する。
  • jest.spyOn()の使い方
    jest.spyOn(console, 'log')
    console.log('foo')
    
    expect(console.log).toHaveBeenCalledWith('foo')
    expect(console.log).toHaveBeenCalledTimes(1)
    
    • 代替実装の定義
      // 返り値を固定値にする。
      console.log.mockReturnValue(true)
      console.log('foo') // true
      
      // 実装をまるっと代替する。
      console.log.mockImplementation((arg1, arg2) => arg1 + arg2)
      console.log('foo', 'bar') // foobar
      
  • jest.fn()の使い方
    • 引数に何も渡さない場合、何もしないモック関数を生成する。
    • 引数に渡すと、それが実行されるモック関数を生成する。
    • 引数なし
      const mockFn = jest.fn()
      mockFn(10, 20) // undefined
      expect(mockFn).toHaveBeenCalledTimes(1)
      
    • 引数あり
      const mockFn = jest.fn((a, b) => a * b)
      mockFn(10, 20) // 200
      expect(mockFn).toHaveBeenCalledTimes(1)
      
    • spyOn()と同じインタフェースのため、後からmockImplementation()を渡すことも可能。
  • jest.mock()の使い方
    const uuid = require('uuid')
    
    jest.mock('uuid')
    uuid.v4.mockReturnValue('a')
    
    // 第2引数に代替実装を渡す書き方もできる。
    // こちらを使えば、同一オブジェクトに対して複数メソッドをまとめてモック化できる。
    jest.mock('uuid', () => {
      v4: () => 'a'
    })
    

参考文献

この記事は以下の情報を参考にして執筆しました。

https://www.oreilly.co.jp/books/9784873119236/


オプティマインドでは「多様性が進んだ世の中でも、全ての人に物が届く世界を持続可能にする」という物流業界の壮大な社会課題を解決すべく、 一緒に働く仲間を大募集中です。 少しでも興味が湧いた方は是非お気軽にカジュアル面談をお申し込みください!

https://recruit.optimind.tech/

Discussion