3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Vitestでモック関数の返り値を指定するメソッド一覧

Posted at

はじめに

Vitestでモック関数の返り値を指定するメソッドをご紹介します。紹介するコードではvi.fn()を使用していますが、vi.spyOnvi.mockでも使用できます。具体的な使用方法は下記の記事を参考にしてください。

返り値を指定

mockReturnValue

test('mockReturnValue', () => {
  const mockFn = vi.fn().mockReturnValue(10)

  expect(mockFn()).toBe(10)
})

mockImplementation

引数を渡して返り値を指定できます。

test('mockImplementation', () => {
  const mockFn = vi.fn().mockImplementation((value) => value * 10)

  expect(mockFn(1)).toBe(10)
})

返り値を指定(非同期)

mockImplementation(非同期)

async/awaitで非同期での返り値を指定できます。

test('mockImplementation(非同期)', async () => {
  const mockFn = vi.fn().mockImplementation(async () => Promise.resolve(10))

  expect(await mockFn()).toBe(10)
})

mockResolvedValue

Promise.resolveで値を返します。

test('mockResolvedValue', async () => {
  const mockFn = vi.fn().mockResolvedValue(10)

  expect(await mockFn()).toBe(10)
})

mockRejectedValue

Promise.rejectで値を返します。

test('mockRejectedValue', async () => {
  const mockFn = vi.fn().mockRejectedValue(10)

  await expect(mockFn()).rejects.toBe(10)
})

呼び出し毎に返り値を変える

mockReturnValueOnce

一度だけ引数の値が返ります。

test('mockReturnValueOnce', () => {
  const mockFn = vi
    .fn()
    .mockReturnValueOnce(10)
    .mockReturnValueOnce(20)
    .mockReturnValue(30)

  expect(mockFn()).toBe(10)
  expect(mockFn()).toBe(20)

  // 3回目以降は30で固定
  expect(mockFn()).toBe(30)
  expect(mockFn()).toBe(30)
})

mockImplementationOnce

一度だけ引数の値が返ります。

test('mockImplementationOnce', () => {
  const mockFn = vi
    .fn()
    .mockImplementationOnce((a) => a * 10)
    .mockImplementationOnce((a) => a * 20)

  expect(mockFn(1)).toBe(10)
  expect(mockFn(1)).toBe(20)

  // 2つしか指定していないため、以降はundefinedとなる
  expect(mockFn(1)).toBe(undefined)
  expect(mockFn(1)).toBe(undefined)
})

呼び出し毎に返り値を変える(非同期)

mockResolvedValueOnce

一度だけPromise.resolveで値を返します。

test('mockResolvedValueOnce', async () => {
  const mockFn = vi
    .fn()
    .mockResolvedValueOnce(10)
    .mockResolvedValueOnce(20)
    .mockResolvedValue(30)

  expect(await mockFn()).toBe(10)
  expect(await mockFn()).toBe(20)

  // 3回目以降は30で固定
  expect(await mockFn()).toBe(30)
  expect(await mockFn()).toBe(30)
})

mockRejectedValueOnce

一度だけPromise.rejectで値を返します。

test('mockRejectedValueOnce', async () => {
  const mockFn = vi.fn().mockRejectedValueOnce(10).mockRejectedValueOnce(20)

  await expect(mockFn()).rejects.toBe(10)
  await expect(mockFn()).rejects.toBe(20)

  // 2つしか指定していないため、以降はundefinedとなる(非同期でない)
  expect(mockFn()).toBe(undefined)
  expect(mockFn()).toBe(undefined)
})

まとめ

Vitestでモック関数の返り値を指定するメソッドをご紹介しました。たくさんメソッドがあって覚えるのが大変という方は、mockImplementationさえ覚えれば応用が効くのでおすすめです。***Once系のメソッドは、指定以降の実行ではundefinedが返り値となるとめ注意が必要です。

最後に

GoQSystemでは一緒に働いてくれる仲間を募集中です!

ご興味がある方は以下リンクよりご確認ください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?