API
@testing-library/dom
このライブラリは、DOM Testing Library (@testing-library/dom
) からすべてを再エクスポートします。使用できる便利な機能については、ドキュメントを参照してください。
render
import {render} from '@testing-library/preact'
const {results} = render(<YourComponent />, {options})
オプション
オプション | 説明 | デフォルト値 |
---|---|---|
container | コンポーネントがマウントされるHTML要素。 | baseElement |
baseElement | コンテナが追加されるルートHTML要素。 | document.body |
queries | baseElementにバインドするクエリ。withinを参照。 | null |
hydrate | コンポーネントが既にマウントされていて、再レンダリングが必要な場合に使用します。ほとんどの人にとっては必要ありません。返されるrerender関数は既にこれを実行しています。 | false |
wrapper | YourComponentをラップする親コンポーネント。 | null |
結果
結果 | 説明 |
---|---|
container | コンポーネントがマウントされるHTML要素。 |
baseElement | コンテナが追加されるルートHTML要素。 |
debug | prettyDomを使用してbaseElementをログ出力します。 |
unmount | コンテナからコンポーネントをアンマウントします。 |
rerender | 元の引数を渡してrenderを再度呼び出し、hydrateをtrueに設定します。 |
asFragment | コンテナのinnerHTMLを返します。 |
...queries | baseElementで使用されるすべてのクエリ関数を返します。query 引数を渡すと、それらが使用されます。それ以外の場合はすべて。 |
cleanup
コンテナからコンポーネントをアンマウントし、コンテナを破棄します。
テストフレームワーク(mocha、Jest、Jasmineなど)がグローバル
afterEach()
関数をテスト環境に注入する場合、これは自動的に呼び出されます。そうでない場合は、各テスト後にcleanup()
を呼び出す必要があります。
これを無効にするには、テストの実行時にprocess.env.PTL_SKIP_AUTO_CLEANUP
をtrueに設定します。
import {render, cleanup} from '@testing-library/preact'
afterEach(() => {
cleanup()
}) // Default on import: runs it after each test.
render(<YourComponent />)
cleanup() // Or like this for more control.
act
preact/test-utils/actを指す単なる利便性のためのエクスポートです。すべてのレンダリングとイベントの発火はact
でラップされているため、実際にはこれは必要ありません。これは、呼び出し後にすべての効果と再レンダリングをフラッシュする役割を担っています。
📝 もっと詳しく知りたい場合は、この説明をご覧ください。React向けですが、なぜそれが必要なのかがわかります。
fireEvent
@testing-library/dom の fireEventに渡します。これもact
でラップされているため、自分で行う必要はありません。
📝 h / Preact.createElement
を使用する場合、Reactは合成イベントシステムを使用し、Preactはイベント処理にブラウザのネイティブaddEventListener
を使用することに注意してください。つまり、ReactのonChange
やonDoubleClick
などのイベントは、PreactではonInput
とonDblClick
になります。ダブルクリックの例は、これらの関数を使用してテストする方法を示しています。
例1
const cb = jest.fn()
function Counter() {
useEffect(cb)
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>{count}</button>
}
const {
container: {firstChild: buttonNode},
} = render(<Counter />)
// Clear the first call to useEffect that the initial render triggers.
cb.mockClear()
// Fire event Option 1.
fireEvent.click(buttonNode)
// Fire event Option 2.
fireEvent(
buttonNode,
new MouseEvent('click', {
bubbles: true,
cancelable: true,
button: 0,
}),
)
expect(buttonNode).toHaveTextContent('1')
expect(cb).toHaveBeenCalledTimes(1)
例2
const handler = jest.fn()
const {
container: {firstChild: input},
} = render(<input type="text" onInput={handler} />)
fireEvent.input(input, {target: {value: 'a'}})
expect(handler).toHaveBeenCalledTimes(1)
例3
const ref = createRef()
const spy = jest.fn()
render(
h(elementType, {
onDblClick: spy,
ref,
}),
)
fireEvent['onDblClick'](ref.current)
expect(spy).toHaveBeenCalledTimes(1)