Skip to content

Commit 94f35e5

Browse files
committed
renderToRenderStream also should be async
1 parent 0e9d9d7 commit 94f35e5

File tree

3 files changed

+22
-26
lines changed

3 files changed

+22
-26
lines changed

src/__tests__/renderToRenderStream.test.tsx

+7-15
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,9 @@ describe('snapshotDOM', () => {
3333
)
3434
}
3535

36-
const {takeRender, renderResultPromise} = renderToRenderStream(
37-
<Counter />,
38-
{
39-
snapshotDOM: true,
40-
},
41-
)
42-
const utils = await renderResultPromise
36+
const {takeRender, utils} = await renderToRenderStream(<Counter />, {
37+
snapshotDOM: true,
38+
})
4339
const incrementButton = utils.getByText('Increment')
4440
await userEvent.click(incrementButton)
4541
await userEvent.click(incrementButton)
@@ -69,14 +65,10 @@ describe('snapshotDOM', () => {
6965
return null
7066
},
7167
}
72-
const {takeRender, renderResultPromise} = renderToRenderStream(
73-
<Component />,
74-
{
75-
queries,
76-
snapshotDOM: true,
77-
},
78-
)
79-
const utils = await renderResultPromise
68+
const {takeRender, utils} = await renderToRenderStream(<Component />, {
69+
queries,
70+
snapshotDOM: true,
71+
})
8072
expect(utils.foo()).toBe(null)
8173
const {withinDOM} = await takeRender()
8274
expect(withinDOM().foo()).toBe(null)

src/disableActEnvironment.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,13 @@ export interface DisableActEnvironmentOptions {
5656
* test("my test", () => {
5757
* const { cleanup } = disableActEnvironment();
5858
*
59-
* // your test code here
60-
*
61-
* cleanup();
59+
* try {
60+
* // your test code here
61+
* } finally {
62+
* cleanup();
63+
* }
6264
* })
65+
* ```
6366
*
6467
* For more context on what `act` is and why you shouldn't use it in renderStream tests,
6568
* https://github.com/reactwg/react-18/discussions/102 is probably the best resource we have.

src/renderToRenderStream.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ export interface RenderStreamWithRenderResult<
2020
Snapshot extends ValidSnapshot = void,
2121
Q extends Queries = SyncQueries,
2222
> extends RenderStream<Snapshot, Q> {
23-
renderResultPromise: Promise<BaseResult<Q>>
23+
utils: BaseResult<Q>
2424
}
2525

2626
/**
2727
* Render into a container which is appended to document.body. It should be used with cleanup.
2828
*/
29-
export function renderToRenderStream<
29+
export async function renderToRenderStream<
3030
Snapshot extends ValidSnapshot = void,
3131
Q extends Queries = SyncQueries,
3232
>(
@@ -39,19 +39,20 @@ export function renderToRenderStream<
3939
queries,
4040
...options
4141
}: RenderOptions<Snapshot, Q> = {},
42-
): RenderStreamWithRenderResult<Snapshot, Q> {
42+
): Promise<RenderStreamWithRenderResult<Snapshot, Q>> {
4343
const {render, ...stream} = createRenderStream<Snapshot, Q>({
4444
onRender,
4545
snapshotDOM,
4646
initialSnapshot,
4747
skipNonTrackingRenders,
4848
queries,
4949
})
50-
// `render` needs to be called asynchronously here, because the definition of `ui`
50+
51+
// We need to wait a tick before calling `render` here, because the definition of `ui`
5152
// might contain components that reference the return value of `renderToRenderStream`
5253
// itself, e.g. `replaceSnapshot` or `mergeSnapshot`.
53-
const renderResultPromise = Promise.resolve().then(() =>
54-
render<Q>(ui, {...options, queries}),
55-
)
56-
return {...stream, renderResultPromise}
54+
await Promise.resolve()
55+
const utils = await render<Q>(ui, {...options, queries})
56+
57+
return {...stream, utils}
5758
}

0 commit comments

Comments
 (0)