API
@testing-library/svelte re-exports everything from @testing-library/dom, as well as:
render
Render your component to the DOM with Svelte. By default, the component will be rendered into a <div> appended to document.body.
import {render} from '@testing-library/svelte'
import MyComponent from './MyComponent.svelte'
const result = render(MyComponent, componentOptions, renderOptions)
Component Options
You may customize how the component is created and mounted. These options are passed directly to Svelte.
If you only need to send props to your component, you may pass props directly, as long as those props don't share a name with a component option.
// pass props to the component
render(YourComponent, {myProp: 'value'})
// pass props and other options to the component
render(YourComponent, {
props: {myProp: 'value'},
context: new Map([[('theme': 'dark')]]),
})
The most common options you will need are:
| Option | Description | Default |
|---|---|---|
props | Props to pass to the component. | N/A |
context | A Map of context values to render the component with. | N/A |
target | An HTMLElement to render the component into. | <div> appended to document.body |
If you specify the target option, the target element will not be appended to document.body automatically, and it will be used as the base element for bound queries and debug.
Refer to the Svelte client-side component API docs for all available options.
Render Options
You may also customize how Svelte Testing Library renders your component. Most of the time, you shouldn't need to modify these options.
Prior to @testing-library/svelte@5.0.0, the baseElement option was named container.
| Option | Description | Default |
|---|---|---|
baseElement | The base element for queries and debug. | componentOptions.target ?? document.body |
queries | Custom Queries. | N/A |
Render Results
| Result | Description |
|---|---|
baseElement | The base DOM element used for queries. |
component | The mounted Svelte component. |
container | The DOM element the component is mounted to. |
debug | Log elements using prettyDOM. |
rerender | Update the component's props. |
unmount | Unmount and destroy the component. |
...queries | Query functions bound to baseElement. |
baseElement
Added in @testing-library/svelte@5.0.0
The base DOM element that queries are bound to. Corresponds to renderOptions.baseElement. If you do not use componentOptions.target nor renderOptions.baseElement, this will be document.body.
container
The DOM element the component is mounted in. Corresponds to componentOptions.target. In general, avoid using container directly to query for elements; use testing-library queries instead.
Use container.firstChild to get the first rendered element of your component.
Prior to @testing-library/svelte@5.0.0, container was set to the base element. Use container.firstChild.firstChild to get the first rendered element of the component in earlier versions.
component
The Svelte component instance. See the Svelte component API for more details.
Avoid using component except to test developer-facing APIs, like exported functions. Instead, interact with the DOM. Read Avoid the Test User by Kent C. Dodds to understand the difference between the end user and developer user.
debug
Log the baseElement or a given element using prettyDOM.
If your baseElement is the default document.body, we recommend using screen.debug.
import {render, screen} from '@testing-library/svelte'
const {debug} = render(MyComponent, {myProp: 'value'})
const button = screen.getByRole('button')
// log `document.body`
screen.debug()
// log your custom `target` or `baseElement`
debug()
// log a specific element
screen.debug(button)
debug(button)
rerender
Update one or more of the component's props and wait for Svelte to update.
const {rerender} = render(MyComponent, {myProp: 'value'})
await rerender({myProp: 'new value'}))
Prior to @testing-library/svelte@5.0.0, calling rerender would destroy and remount the component. Use component.$set and act to update props in earlier versions:
const {component} = render(MyComponent, {myProp: 'value'})
await act(() => component.$set({myProp: 'new value'}))
unmount
Unmount and destroy the Svelte component.
const {unmount} = render(MyComponent, {myProp: 'value'})
unmount()
Queries
Query functions bound to the baseElement. If you passed custom queries to render, those will be available instead of the default queries.
If your baseElement is the default document.body, we recommend using screen rather than bound queries.
import {render, screen} from '@testing-library/svelte'
const {getByRole} = render(MyComponent, {myProp: 'value'})
// query `document.body`
const button = screen.getByRole('button')
// query using a custom `target` or `baseElement`
const button = getByRole('button')
cleanup
Destroy all components and remove any elements added to document.body.
cleanup is called automatically if your testing framework adds a global afterEach method (e.g. Mocha, Jest, or Jasmine), or if you use import '@testing-library/svelte/vitest' in your Vitest setup file. Usually, you shouldn't need to call cleanup yourself.
If you'd like to disable automatic cleanup in a framework that uses a global afterEach method, set process.env.STL_SKIP_AUTO_CLEANUP.
import {render, cleanup} from '@testing-library/svelte'
// Default: runs after each test
afterEach(() => {
cleanup()
})
render(YourComponent)
// Called manually for more control
cleanup()
act
Ensure all pending updates from Svelte are applied to the DOM. Optionally, you may pass a function to be called before updates are applied. If the function returns a Promise, it will be resolved first.
Uses Svelte's tick method to apply updates.
import {act, render} from '@testing-library/svelte'
const {component} = render(MyComponent)
await act(() => {
component.updateSomething()
})
fireEvent (async)
Fire an event and wait for Svelte to update the DOM. An asynchronous wrapper of DOM Testing Library's fireEvent.
Where possible, we recommend @testing-library/user-event instead of fireEvent.
import {fireEvent, render, screen} from '@testing-library/svelte'
render(MyComponent)
const button = screen.getByRole('button')
await fireEvent.click(button)