Skip to content
Vitest 2
Main Navigation ガイドAPI設定ブラウザモード高度な
2.1.9
1.6.1
0.34.6

日本語

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
한국어
Italiano
Polski
Türkçe
čeština
magyar

日本語

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
한국어
Italiano
Polski
Türkçe
čeština
magyar

外観

Sidebar Navigation

テスト API リファレンス

モック関数

Vi

expect

expectTypeOf

assert

assertType

このページの内容

モック関数 ​

vi.fn メソッドを使用すると、モック関数を作成し、その実行を追跡できます。既存のオブジェクトのメソッドを追跡したい場合は、vi.spyOn メソッドを使用できます。

js
import { vi } from 'vitest';

const fn = vi.fn();
fn('hello world');
fn.mock.calls[0] === ['hello world'];

const market = {
  getApples: () => 100,
};

const getApplesSpy = vi.spyOn(market, 'getApples');
market.getApples();
getApplesSpy.mock.calls.length === 1;

モックの結果を検証するには、expect を使用してモックアサーション(例: toHaveBeenCalled)を行う必要があります。この API リファレンスでは、モックの動作を操作するために利用可能なプロパティとメソッドについて説明します。

TIP

以下の型定義におけるカスタム関数実装は、ジェネリック <T> でマークされています。

getMockImplementation ​

ts
function getMockImplementation(): T | undefined;

現在のモック実装があれば返します。

モックが vi.fn で作成された場合、提供されたメソッドをモック実装として使用します。

モックが vi.spyOn で作成された場合、カスタム実装が提供されない限り undefined を返します。

getMockName ​

ts
function getMockName(): string;

.mockName(name) メソッドでモックに割り当てられた名前を返します。デフォルトでは vi.fn() を返します。

mockClear ​

ts
function mockClear(): MockInstance<T>;

すべての呼び出しに関する情報をクリアします。これを呼び出すと、.mock のすべてのプロパティは初期状態に戻ります。このメソッドは実装をリセットしません。異なるアサーション間でモックをクリーンアップするのに便利です。

各テストの前にこのメソッドを自動的に呼び出すには、設定で clearMocks 設定を有効にします。

mockName ​

ts
function mockName(name: string): MockInstance<T>;

内部モック名を設定します。これは、アサーションが失敗したときにモックを識別するのに便利です。

mockImplementation ​

ts
function mockImplementation(fn: T): MockInstance<T>;

モック実装として使用する関数を受け取ります。TypeScript は、引数と戻り値の型が元の関数と一致することを要求します。

ts
const mockFn = vi.fn().mockImplementation((apples: number) => apples + 1);
// or: vi.fn(apples => apples + 1);

const NelliesBucket = mockFn(0);
const BobsBucket = mockFn(1);

NelliesBucket === 1; // true
BobsBucket === 2; // true

mockFn.mock.calls[0][0] === 0; // true
mockFn.mock.calls[1][0] === 1; // true

mockImplementationOnce ​

ts
function mockImplementationOnce(fn: T): MockInstance<T>;

モック実装として使用する関数を受け取ります。TypeScript は、引数と戻り値の型が元の関数と一致することを要求します。このメソッドはチェーン可能で、複数の関数呼び出しに対して異なる結果を生成できます。

ts
const myMockFn = vi
  .fn()
  .mockImplementationOnce(() => true) // 1st call
  .mockImplementationOnce(() => false); // 2nd call

myMockFn(); // 1st call: true
myMockFn(); // 2nd call: false

モック関数の実装がすべて使用された場合、vi.fn(() => defaultValue) または .mockImplementation(() => defaultValue) で設定されたデフォルト実装が呼び出されます。

ts
const myMockFn = vi
  .fn(() => 'default')
  .mockImplementationOnce(() => 'first call')
  .mockImplementationOnce(() => 'second call');

// 'first call', 'second call', 'default', 'default'
console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());

withImplementation ​

ts
function withImplementation(fn: T, cb: () => void): MockInstance<T>;
function withImplementation(
  fn: T,
  cb: () => Promise<void>
): Promise<MockInstance<T>>;

コールバック実行中は、元のモック実装を一時的にオーバーライドします。

js
const myMockFn = vi.fn(() => 'original');

myMockFn.withImplementation(
  () => 'temp',
  () => {
    myMockFn(); // 'temp'
  }
);

myMockFn(); // 'original'

非同期コールバックで使用できます。このメソッドは await する必要があり、その後元の実装が使用されます。

ts
test('async callback', async () => {
  const myMockFn = vi.fn(() => 'original');

  // We await this call since the callback is async
  await myMockFn.withImplementation(
    () => 'temp',
    async () => {
      myMockFn(); // 'temp'
    }
  );

  myMockFn(); // 'original'
});

このメソッドは mockImplementationOnce よりも優先されることに注意してください。

mockRejectedValue ​

ts
function mockRejectedValue(value: unknown): MockInstance<T>;

非同期関数が呼び出されたときに拒否されるエラーを受け取ります。

ts
const asyncMock = vi.fn().mockRejectedValue(new Error('Async error'));

await asyncMock(); // throws Error<'Async error'>

mockRejectedValueOnce ​

ts
function mockRejectedValueOnce(value: unknown): MockInstance<T>;

次の関数呼び出しで拒否される値を受け取ります。チェーンされている場合、連続する各呼び出しは指定された値を拒否します。

ts
const asyncMock = vi
  .fn()
  .mockResolvedValueOnce('first call')
  .mockRejectedValueOnce(new Error('Async error'));

await asyncMock(); // 'first call'
await asyncMock(); // throws Error<'Async error'>

mockReset ​

ts
function mockReset(): MockInstance<T>;

mockClear と同じアクションを実行し、内部実装を空の関数 (呼び出されたときに undefined を返す) に設定します。これにより、すべての "once" 実装もリセットされます。モックを完全にデフォルトの状態にリセットするのに便利です。

各テストの前にこのメソッドを自動的に呼び出すには、設定で mockReset 設定を有効にします。

mockRestore ​

ts
function mockRestore(): MockInstance<T>;

mockReset と同じアクションを実行し、内部実装を元の関数に復元します。

vi.fn() で作成されたモックを復元すると、実装は undefined を返す空の関数に設定されます。vi.fn(impl) で作成されたモックを復元すると、実装は impl に復元されます。

各テストの前にこのメソッドを自動的に呼び出すには、設定で restoreMocks 設定を有効にします。

mockResolvedValue ​

ts
function mockResolvedValue(value: Awaited<ReturnType<T>>): MockInstance<T>;

非同期関数が呼び出されたときに解決される値を受け取ります。TypeScript は、元の関数の戻り値の型と一致する値のみを受け取ります。

ts
const asyncMock = vi.fn().mockResolvedValue(42);

await asyncMock(); // 42

mockResolvedValueOnce ​

ts
function mockResolvedValueOnce(value: Awaited<ReturnType<T>>): MockInstance<T>;

次の関数呼び出しで解決される値を受け取ります。TypeScript は、元の関数の戻り値の型と一致する値のみを受け取ります。チェーンされている場合、連続する各呼び出しは指定された値を解決します。

ts
const asyncMock = vi
  .fn()
  .mockResolvedValue('default')
  .mockResolvedValueOnce('first call')
  .mockResolvedValueOnce('second call');

await asyncMock(); // first call
await asyncMock(); // second call
await asyncMock(); // default
await asyncMock(); // default

mockReturnThis ​

ts
function mockReturnThis(): MockInstance<T>;

実際の実行を呼び出さずに、メソッドから this コンテキストを返す必要がある場合に使用します。これは、次のショートハンドです。

ts
spy.mockImplementation(function () {
  return this;
});

mockReturnValue ​

ts
function mockReturnValue(value: ReturnType<T>): MockInstance<T>;

モック関数が呼び出されるたびに返す値を受け取ります。TypeScript は、元の関数の戻り値の型と一致する値のみを受け取ります。

ts
const mock = vi.fn();
mock.mockReturnValue(42);
mock(); // 42
mock.mockReturnValue(43);
mock(); // 43

mockReturnValueOnce ​

ts
function mockReturnValueOnce(value: ReturnType<T>): MockInstance<T>;

モック関数が呼び出されるたびに返す値を受け取ります。TypeScript は、元の関数の戻り値の型と一致する値のみを受け取ります。

モックされた関数が実装を使い果たした場合、vi.fn(() => defaultValue) または .mockImplementation(() => defaultValue) で設定されたデフォルト実装が呼び出されます。

ts
const myMockFn = vi
  .fn()
  .mockReturnValue('default')
  .mockReturnValueOnce('first call')
  .mockReturnValueOnce('second call');

// 'first call', 'second call', 'default', 'default'
console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());

mock.calls ​

ts
const calls: Parameters<T>[];

これは各呼び出しの全引数を格納した配列です。各要素はその呼び出しの引数です。

js
const fn = vi.fn();

fn('arg1', 'arg2');
fn('arg3');

fn.mock.calls ===
  [
    ['arg1', 'arg2'], // first call
    ['arg3'], // second call
  ];

mock.lastCall ​

ts
const lastCall: Parameters<T> | undefined;

これは、最後の呼び出しの引数を含みます。モックが呼び出されなかった場合、undefined を返します。

mock.results ​

ts
interface MockResultReturn<T> {
  type: 'return';
  /**
   * The value that was returned from the function.
   * If function returned a Promise, then this will be a resolved value.
   */
  value: T;
}

interface MockResultIncomplete {
  type: 'incomplete';
  value: undefined;
}

interface MockResultThrow {
  type: 'throw';
  /**
   * An error that was thrown during function execution.
   */
  value: any;
}

type MockResult<T> =
  | MockResultReturn<T>
  | MockResultThrow
  | MockResultIncomplete;

const results: MockResult<ReturnType<T>>[];

これは、関数が返したすべての値を含む配列です。配列の各項目は、type と value のプロパティを持つオブジェクトです。利用可能なタイプは次のとおりです。

  • 'return' - 関数が例外をスローせずに終了しました。
  • 'throw' - 関数が例外をスローしました。

value プロパティには、返された値またはスローされたエラーが含まれます。関数が Promise を返した場合、プロミスが拒否された場合でも result は常に 'return' になります。

js
const fn = vi
  .fn()
  .mockReturnValueOnce('result')
  .mockImplementationOnce(() => {
    throw new Error('thrown error');
  });

const result = fn(); // returned 'result'

try {
  fn(); // threw Error
} catch {}

fn.mock.results ===
  [
    // first result
    {
      type: 'return',
      value: 'result',
    },
    // last result
    {
      type: 'throw',
      value: Error,
    },
  ];

mock.settledResults ​

ts
interface MockSettledResultFulfilled<T> {
  type: 'fulfilled';
  value: T;
}

interface MockSettledResultRejected {
  type: 'rejected';
  value: any;
}

export type MockSettledResult<T> =
  | MockSettledResultFulfilled<T>
  | MockSettledResultRejected;

const settledResults: MockSettledResult<Awaited<ReturnType<T>>>[];

関数から resolved または rejected されたすべての値を含む配列です。

関数が解決/拒否されていない場合、この配列は空になります。

js
const fn = vi.fn().mockResolvedValueOnce('result');

const result = fn();

fn.mock.settledResults === [];

await result;

fn.mock.settledResults ===
  [
    {
      type: 'fulfilled',
      value: 'result',
    },
  ];

mock.invocationCallOrder ​

ts
const invocationCallOrder: number[];

このプロパティは、モック関数の実行順序を返します。これは、定義されたすべてのモック間で共有される数値の配列です。

js
const fn1 = vi.fn();
const fn2 = vi.fn();

fn1();
fn2();
fn1();

fn1.mock.invocationCallOrder === [1, 3];
fn2.mock.invocationCallOrder === [2];

mock.contexts ​

ts
const contexts: ThisParameterType<T>[];

このプロパティは、モック関数への各呼び出し中に使用された this 値の配列です。

js
const fn = vi.fn();
const context = {};

fn.apply(context);
fn.call(context);

fn.mock.contexts[0] === context;
fn.mock.contexts[1] === context;

mock.instances ​

ts
const instances: ReturnType<T>[];

このプロパティは、モックが new キーワードで呼び出されたときに作成されたすべてのインスタンスを含む配列です。これは、関数の実際のコンテキスト (this) であり、戻り値ではないことに注意してください。

WARNING

モックが new MyClass() でインスタンス化された場合、mock.instances は 1 つの値を持つ配列になります。

js
const MyClass = vi.fn();
const a = new MyClass();

MyClass.mock.instances[0] === a;

コンストラクターから値を返した場合、それは instances 配列には含まれず、代わりに results に含まれます。

js
const Spy = vi.fn(() => ({ method: vi.fn() }));
const a = new Spy();

Spy.mock.instances[0] !== a;
Spy.mock.results[0] === a;
Pager
前のページテスト API リファレンス
次のページVi

MITライセンス の下で公開されています。

Copyright (c) 2024 Mithril Contributors

https://v2.vitest.dev/api/mock

MITライセンス の下で公開されています。

Copyright (c) 2024 Mithril Contributors