コンテンツにスキップする

マッチ屋の拡張

VitestはChaiとJestの両方と互換性があるため、好みによってchai.useAPIまたはexpect.extendを使用できます。

このガイドでは、expect.extendを使用してマッチアを拡張する方法について説明します。ChaiのAPIに興味がある場合は、ガイドを確認してください。

既定のマッチアを拡張するには、マッチアを含むオブジェクトでexpect.extendを呼び出します。

ts
expect.extend({
  toBeFoo(received, expected) {
    const { isNot } = this
    return {
      // do not alter your "pass" based on isNot. Vitest does it for you
      pass: received === 'foo',
      message: () => `${received} is${isNot ? ' not' : ''} foo`
    }
  }
})

TypeScriptを使用している場合、Vitest 0.31.0以降は、アンビエント宣言ファイル(例:vitest.d.ts)で次のコードを使用して既定のAssertionインターフェイスを拡張できます。

ts
import type { Assertion, AsymmetricMatchersContaining } from 'vitest'

interface CustomMatchers<R = unknown> {
  toBeFoo: () => R
}

declare module 'vitest' {
  interface Assertion<T = any> extends CustomMatchers<T> {}
  interface AsymmetricMatchersContaining extends CustomMatchers {}
}

警告

アンビエント宣言ファイルをtsconfig.jsonに含めることを忘れないでください。

マッチアの戻り値は次のインターフェイスと互換性が必要です。

ts
interface MatcherResult {
  pass: boolean
  message: () => string
  // If you pass these, they will automatically appear inside a diff when
  // the matcher does not pass, so you don't need to print the diff yourself
  actual?: unknown
  expected?: unknown
}

警告

非同期マッチアを作成する場合は、テスト自体で結果を非同期にすることを忘れないでください(await expect('foo').toBeFoo())。

マッチアの関数の最初の引数は、受信値(expect(received)内)です。残りはマッチアに直接渡される引数です。

マッチア関数には、次のプロパティを持つthisコンテキストにアクセスできます。

  • isNot

    notでマッチアが呼び出された場合にtrueを返します(expect(received).not.toBeFoo())。

  • 約束

    resolved/rejectedでマッチアが呼び出された場合、この値には修飾子の名前が含まれます。それ以外の場合は、空文字列になります。

  • equals

    これは2つの値を比較するためのユーティリティ関数です。値が等しい場合はtrueを返し、そうでない場合はfalseを返します。この関数は、デフォルトで非対称マッチアを持つオブジェクトに対して内部的に使用されます。

  • utils

    これには、メッセージを表示するために使用できるユーティリティ関数が一式含まれています。

thisコンテキストには、現在のテストに関する情報も含まれています。expect.getState()を呼び出すことでも取得できます。最も便利なプロパティは次のとおりです。

  • currentTestName

    現在のテストの完全名(describeブロックを含む)。

  • testPath

    現在のテストへのパス。

MIT ライセンスでリリースされました。