@@ -632,6 +632,77 @@ describe('ReactHooks', () => {
632632 ] ) ;
633633 } ) ;
634634
635+ it ( 'warns if deps is not an array' , ( ) => {
636+ const { useEffect, useLayoutEffect, useMemo, useCallback} = React ;
637+
638+ function App ( props ) {
639+ useEffect ( ( ) => { } , props . deps ) ;
640+ useLayoutEffect ( ( ) => { } , props . deps ) ;
641+ useMemo ( ( ) => { } , props . deps ) ;
642+ useCallback ( ( ) => { } , props . deps ) ;
643+ return null ;
644+ }
645+
646+ expect ( ( ) => {
647+ ReactTestRenderer . create ( < App deps = { 'hello' } /> ) ;
648+ } ) . toWarnDev ( [
649+ 'Warning: useEffect received a final argument that is not an array (instead, received `string`). ' +
650+ 'When specified, the final argument must be an array.' ,
651+ 'Warning: useLayoutEffect received a final argument that is not an array (instead, received `string`). ' +
652+ 'When specified, the final argument must be an array.' ,
653+ 'Warning: useMemo received a final argument that is not an array (instead, received `string`). ' +
654+ 'When specified, the final argument must be an array.' ,
655+ 'Warning: useCallback received a final argument that is not an array (instead, received `string`). ' +
656+ 'When specified, the final argument must be an array.' ,
657+ ] ) ;
658+ expect ( ( ) => {
659+ ReactTestRenderer . create ( < App deps = { 100500 } /> ) ;
660+ } ) . toWarnDev ( [
661+ 'Warning: useEffect received a final argument that is not an array (instead, received `number`). ' +
662+ 'When specified, the final argument must be an array.' ,
663+ 'Warning: useLayoutEffect received a final argument that is not an array (instead, received `number`). ' +
664+ 'When specified, the final argument must be an array.' ,
665+ 'Warning: useMemo received a final argument that is not an array (instead, received `number`). ' +
666+ 'When specified, the final argument must be an array.' ,
667+ 'Warning: useCallback received a final argument that is not an array (instead, received `number`). ' +
668+ 'When specified, the final argument must be an array.' ,
669+ ] ) ;
670+ expect ( ( ) => {
671+ ReactTestRenderer . create ( < App deps = { { } } /> ) ;
672+ } ) . toWarnDev ( [
673+ 'Warning: useEffect received a final argument that is not an array (instead, received `object`). ' +
674+ 'When specified, the final argument must be an array.' ,
675+ 'Warning: useLayoutEffect received a final argument that is not an array (instead, received `object`). ' +
676+ 'When specified, the final argument must be an array.' ,
677+ 'Warning: useMemo received a final argument that is not an array (instead, received `object`). ' +
678+ 'When specified, the final argument must be an array.' ,
679+ 'Warning: useCallback received a final argument that is not an array (instead, received `object`). ' +
680+ 'When specified, the final argument must be an array.' ,
681+ ] ) ;
682+ ReactTestRenderer . create ( < App deps = { [ ] } /> ) ;
683+ ReactTestRenderer . create ( < App deps = { null } /> ) ;
684+ ReactTestRenderer . create ( < App deps = { undefined } /> ) ;
685+ } ) ;
686+
687+ it ( 'warns if deps is not an array for useImperativeHandle' , ( ) => {
688+ const { useImperativeHandle} = React ;
689+
690+ const App = React . forwardRef ( ( props , ref ) => {
691+ useImperativeHandle ( ref , ( ) => { } , props . deps ) ;
692+ return null ;
693+ } ) ;
694+
695+ expect ( ( ) => {
696+ ReactTestRenderer . create ( < App deps = { 'hello' } /> ) ;
697+ } ) . toWarnDev ( [
698+ 'Warning: useImperativeHandle received a final argument that is not an array (instead, received `string`). ' +
699+ 'When specified, the final argument must be an array.' ,
700+ ] ) ;
701+ ReactTestRenderer . create ( < App deps = { [ ] } /> ) ;
702+ ReactTestRenderer . create ( < App deps = { null } /> ) ;
703+ ReactTestRenderer . create ( < App deps = { undefined } /> ) ;
704+ } ) ;
705+
635706 it ( 'assumes useEffect clean-up function is either a function or undefined' , ( ) => {
636707 const { useLayoutEffect} = React ;
637708
0 commit comments