@@ -632,6 +632,77 @@ describe('ReactHooks', () => {
632
632
] ) ;
633
633
} ) ;
634
634
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
+
635
706
it ( 'assumes useEffect clean-up function is either a function or undefined' , ( ) => {
636
707
const { useLayoutEffect} = React ;
637
708
0 commit comments