-
Notifications
You must be signed in to change notification settings - Fork 20
Open
Description
The query commands (getByRole, getByTestId, etc.) fail to pick up children of <Portal>s.
The children of <Portal>s get rendered in a separate <div> from the content of the render call. The various query commands seem to use the container element, which is the first <div>, and fail to pick up anything in a portal:
import { expect, test } from 'vitest';
import { render } from '@solidjs/testing-library';
import { Portal } from 'solid-js/web';
test('Portal test', () => {
const { getByTestId, debug } = render(() => <>
<p data-testid='one'>One</p>
<Portal>
<p data-testid='two'>Two</p>
</Portal>
</>);
getByTestId('one'); // Succeeds
getByTestId('two'); // Throws an error
debug(); // Prints the following:
/*
<body>
<div>
<p data-testid="one">
One
</p>
</div>
<div>
<p data-testid="two">
Two
</p>
</div>
</body>
*/
});One workaround is to use the baseElement property with a query selector, i.e. baseElement.querySelector('[data-testid="two"]'). However, Solid Testing Library reuses the <body> between render()s:
test('aaa', () => {
render(() => <p>test 1</p>);
render(() => <p>test 2</p>);
const res = render(() => <p>test 3</p>);
res.debug(); // Prints out the following:
/*
<body>
<div>
<p>test 1</p>
</div>
<div>
<p>test 2</p>
</div>
<div>
<p>test 3</p>
</div>
</body>
*/
});So, if you have two tests in one file, they will both be rendered in the same document, and so you'll likely run into issues when using baseElement.querySelector, as it might select elements from a different test.
Metadata
Metadata
Assignees
Labels
No labels