@@ -351,35 +351,6 @@ describe('ref swapping', () => {
351
351
'Expected ref to be a function, a string, an object returned by React.createRef(), or null.' ,
352
352
) ;
353
353
} ) ;
354
-
355
- it ( 'should warn about callback refs returning a function' , ( ) => {
356
- const container = document . createElement ( 'div' ) ;
357
- expect ( ( ) => {
358
- ReactDOM . render ( < div ref = { ( ) => ( ) => { } } /> , container ) ;
359
- } ) . toErrorDev ( 'Unexpected return value from a callback ref in div' ) ;
360
-
361
- // Cleanup should warn, too.
362
- expect ( ( ) => {
363
- ReactDOM . render ( < span /> , container ) ;
364
- } ) . toErrorDev ( 'Unexpected return value from a callback ref in div' , {
365
- withoutStack : true ,
366
- } ) ;
367
-
368
- // No warning when returning non-functions.
369
- ReactDOM . render ( < p ref = { ( ) => ( { } ) } /> , container ) ;
370
- ReactDOM . render ( < p ref = { ( ) => null } /> , container ) ;
371
- ReactDOM . render ( < p ref = { ( ) => undefined } /> , container ) ;
372
-
373
- // Still warns on functions (not deduped).
374
- expect ( ( ) => {
375
- ReactDOM . render ( < div ref = { ( ) => ( ) => { } } /> , container ) ;
376
- } ) . toErrorDev ( 'Unexpected return value from a callback ref in div' ) ;
377
- expect ( ( ) => {
378
- ReactDOM . unmountComponentAtNode ( container ) ;
379
- } ) . toErrorDev ( 'Unexpected return value from a callback ref in div' , {
380
- withoutStack : true ,
381
- } ) ;
382
- } ) ;
383
354
} ) ;
384
355
385
356
describe ( 'root level refs' , ( ) => {
@@ -534,3 +505,69 @@ describe('strings refs across renderers', () => {
534
505
expect ( inst . refs . child2 ) . toBe ( div2 . firstChild ) ;
535
506
} ) ;
536
507
} ) ;
508
+
509
+ describe ( 'refs return clean up function' , ( ) => {
510
+ it ( 'does not break' , ( ) => {
511
+ const container = document . createElement ( 'div' ) ;
512
+ let cleanUp = jest . fn ( ) ;
513
+ let setup = jest . fn ( ) ;
514
+
515
+ ReactDOM . render (
516
+ < div
517
+ ref = { _ref => {
518
+ setup ( _ref ) ;
519
+ return cleanUp ;
520
+ } }
521
+ /> ,
522
+ container ,
523
+ ) ;
524
+
525
+ ReactDOM . render (
526
+ < div
527
+ ref = { _ref => {
528
+ setup ( _ref ) ;
529
+ } }
530
+ /> ,
531
+ container ,
532
+ ) ;
533
+
534
+ expect ( setup ) . toHaveBeenCalledTimes ( 2 ) ;
535
+ expect ( cleanUp ) . toHaveBeenCalledTimes ( 1 ) ;
536
+ expect ( cleanUp . mock . calls [ 0 ] [ 0 ] ) . toBe ( undefined ) ;
537
+
538
+ ReactDOM . render ( < div ref = { _ref => { } } /> , container ) ;
539
+
540
+ expect ( cleanUp ) . toHaveBeenCalledTimes ( 1 ) ;
541
+ expect ( setup ) . toHaveBeenCalledTimes ( 3 ) ;
542
+ expect ( setup . mock . calls [ 2 ] [ 0 ] ) . toBe ( null ) ;
543
+
544
+ cleanUp = jest . fn ( ) ;
545
+ setup = jest . fn ( ) ;
546
+
547
+ ReactDOM . render (
548
+ < div
549
+ ref = { _ref => {
550
+ setup ( _ref ) ;
551
+ return cleanUp ;
552
+ } }
553
+ /> ,
554
+ container ,
555
+ ) ;
556
+
557
+ expect ( setup ) . toHaveBeenCalledTimes ( 1 ) ;
558
+ expect ( cleanUp ) . toHaveBeenCalledTimes ( 0 ) ;
559
+
560
+ ReactDOM . render (
561
+ < div
562
+ ref = { _ref => {
563
+ setup ( _ref ) ;
564
+ return cleanUp ;
565
+ } }
566
+ /> ,
567
+ container ,
568
+ ) ;
569
+
570
+ expect ( setup ) . toHaveBeenCalledTimes ( 2 ) ;
571
+ expect ( cleanUp ) . toHaveBeenCalledTimes ( 1 ) ;
572
+ } ) ;
573
+ } ) ;
0 commit comments