@@ -351,35 +351,6 @@ describe('ref swapping', () => {
351351 'Expected ref to be a function, a string, an object returned by React.createRef(), or null.' ,
352352 ) ;
353353 } ) ;
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- } ) ;
383354} ) ;
384355
385356describe ( 'root level refs' , ( ) => {
@@ -534,3 +505,69 @@ describe('strings refs across renderers', () => {
534505 expect ( inst . refs . child2 ) . toBe ( div2 . firstChild ) ;
535506 } ) ;
536507} ) ;
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