1
1
import { createElement , render , Component } from 'preact' ;
2
+ import { setupRerender } from 'preact/test-utils' ;
2
3
import { setupScratch , teardown } from '../../_util/helpers' ;
3
4
4
5
/** @jsx createElement */
@@ -7,8 +8,12 @@ describe('Lifecycle methods', () => {
7
8
/** @type {HTMLDivElement } */
8
9
let scratch ;
9
10
11
+ /** @type {() => void } */
12
+ let rerender ;
13
+
10
14
beforeEach ( ( ) => {
11
15
scratch = setupScratch ( ) ;
16
+ rerender = setupRerender ( ) ;
12
17
} ) ;
13
18
14
19
afterEach ( ( ) => {
@@ -39,5 +44,40 @@ describe('Lifecycle methods', () => {
39
44
40
45
expect ( componentState ) . to . deep . equal ( { value : 1 } ) ;
41
46
} ) ;
47
+
48
+ it ( 'should invoke setState callbacks when setState is called in componentWillMount' , ( ) => {
49
+ let componentState ;
50
+ let callback = sinon . spy ( ) ;
51
+
52
+ class Foo extends Component {
53
+ constructor ( props ) {
54
+ super ( props ) ;
55
+ this . state = {
56
+ value : 0
57
+ } ;
58
+ }
59
+ componentWillMount ( ) {
60
+ this . setState ( { value : 1 } , callback ) ;
61
+ this . setState ( { value : 2 } , ( ) => {
62
+ callback ( ) ;
63
+ this . setState ( { value : 3 } , callback ) ;
64
+ } ) ;
65
+ }
66
+ render ( ) {
67
+ componentState = this . state ;
68
+ return < div /> ;
69
+ }
70
+ }
71
+
72
+ render ( < Foo /> , scratch ) ;
73
+
74
+ expect ( componentState ) . to . deep . equal ( { value : 2 } ) ;
75
+ expect ( callback ) . to . have . been . calledTwice ;
76
+
77
+ rerender ( ) ;
78
+
79
+ expect ( componentState ) . to . deep . equal ( { value : 3 } ) ;
80
+ expect ( callback ) . to . have . been . calledThrice ;
81
+ } ) ;
42
82
} ) ;
43
83
} ) ;
0 commit comments