はじめに
Vitestでモック関数の返り値を指定するメソッドをご紹介します。紹介するコードではvi.fn()
を使用していますが、vi.spyOn
やvi.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では一緒に働いてくれる仲間を募集中です!
ご興味がある方は以下リンクよりご確認ください。