マッチ屋の拡張
VitestはChaiとJestの両方と互換性があるため、好みによってchai.use
APIまたはexpect.extend
を使用できます。
このガイドでは、expect.extend
を使用してマッチアを拡張する方法について説明します。ChaiのAPIに興味がある場合は、ガイドを確認してください。
既定のマッチアを拡張するには、マッチアを含むオブジェクトでexpect.extend
を呼び出します。
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
インターフェイスを拡張できます。
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
に含めることを忘れないでください。
マッチアの戻り値は次のインターフェイスと互換性が必要です。
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
現在のテストへのパス。