@@ -12,6 +12,8 @@ import {
12
12
waitFor ,
13
13
waitForElementToBeRemoved ,
14
14
fireEvent as dtlFireEvent ,
15
+ screen as dtlScreen ,
16
+ queries as dtlQueries ,
15
17
} from '@testing-library/dom' ;
16
18
import { RenderComponentOptions , RenderDirectiveOptions , RenderResult } from './models' ;
17
19
import { createSelectOptions , createType , tab } from './user-events' ;
@@ -178,7 +180,7 @@ export async function render<SutType, WrapperType = SutType>(
178
180
tab,
179
181
waitFor : componentWaitFor ,
180
182
waitForElementToBeRemoved : componentWaitForElementToBeRemoved ,
181
- ...getQueriesForElement ( fixture . nativeElement , queries ) ,
183
+ ...replaceFindWithFindAndDetectChanges ( fixture . nativeElement , getQueriesForElement ( fixture . nativeElement , queries ) ) ,
182
184
...eventsWithDetectChanges ,
183
185
} ;
184
186
}
@@ -241,6 +243,30 @@ function addAutoImports({ imports, routes }: Pick<RenderComponentOptions<any>, '
241
243
return [ ...imports , ...animations ( ) , ...routing ( ) ] ;
242
244
}
243
245
246
+ // for the findBy queries we first want to run a change detection cycle
247
+ function replaceFindWithFindAndDetectChanges < T > ( container : HTMLElement , originalQueriesForContainer : T ) : T {
248
+ return Object . keys ( originalQueriesForContainer ) . reduce (
249
+ ( newQueries , key ) => {
250
+ if ( key . startsWith ( 'find' ) ) {
251
+ const getByQuery = dtlQueries [ key . replace ( 'find' , 'get' ) ] ;
252
+ newQueries [ key ] = async ( text , options , waitForOptions ) => {
253
+ // original implementation at https://github.com/testing-library/dom-testing-library/blob/master/src/query-helpers.js
254
+ const result = await waitFor ( ( ) => {
255
+ detectChangesForMountedFixtures ( ) ;
256
+ return getByQuery ( container , text , options ) ;
257
+ } , waitForOptions ) ;
258
+ return result ;
259
+ } ;
260
+ } else {
261
+ newQueries [ key ] = originalQueriesForContainer [ key ] ;
262
+ }
263
+
264
+ return newQueries ;
265
+ } ,
266
+ { } as T ,
267
+ ) ;
268
+ }
269
+
244
270
function cleanup ( ) {
245
271
mountedFixtures . forEach ( cleanupAtFixture ) ;
246
272
}
@@ -258,20 +284,24 @@ if (typeof afterEach === 'function' && !process.env.ATL_SKIP_AUTO_CLEANUP) {
258
284
} ) ;
259
285
}
260
286
287
+ function detectChangesForMountedFixtures ( ) {
288
+ mountedFixtures . forEach ( fixture => fixture . detectChanges ( ) ) ;
289
+ }
290
+
261
291
export * from '@testing-library/dom' ;
262
292
263
293
const fireEvent = Object . keys ( dtlFireEvent ) . reduce (
264
294
( events , key ) => {
265
295
events [ key ] = ( element : HTMLElement , options ?: { } ) => {
266
296
const result = dtlFireEvent [ key ] ( element , options ) ;
267
- mountedFixtures . forEach ( fixture => {
268
- fixture . detectChanges ( ) ;
269
- } ) ;
297
+ detectChangesForMountedFixtures ( ) ;
270
298
return result ;
271
299
} ;
272
300
return events ;
273
301
} ,
274
- { } as FireFunction & FireObject ,
302
+ { } as typeof dtlFireEvent ,
275
303
) ;
276
304
277
- export { fireEvent } ;
305
+ const screen = replaceFindWithFindAndDetectChanges ( document . body , dtlScreen ) ;
306
+
307
+ export { fireEvent , screen } ;
0 commit comments