@@ -9,7 +9,7 @@ describe('defer', () => {
99
1010 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
1111
12- await Promise . resolve ( ) ;
12+ await deferred . wait ( ) ;
1313
1414 expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
1515 } ) ;
@@ -24,7 +24,7 @@ describe('defer', () => {
2424
2525 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
2626
27- await Promise . resolve ( ) ;
27+ await deferred . wait ( ) ;
2828
2929 expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
3030 } ) ;
@@ -39,15 +39,15 @@ describe('defer', () => {
3939
4040 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
4141
42- await Promise . resolve ( ) ;
42+ await deferred . wait ( ) ;
4343
4444 expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
4545
4646 deferred ( ) ;
4747 deferred ( ) ;
4848 deferred ( ) ;
4949
50- await Promise . resolve ( ) ;
50+ await deferred . wait ( ) ;
5151
5252 expect ( fn ) . toHaveBeenCalledTimes ( 2 ) ;
5353 } ) ;
@@ -64,7 +64,7 @@ describe('defer', () => {
6464
6565 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
6666
67- await Promise . resolve ( ) ;
67+ await deferred . wait ( ) ;
6868
6969 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
7070 } ) ;
@@ -81,13 +81,13 @@ describe('defer', () => {
8181
8282 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
8383
84- await Promise . resolve ( ) ;
84+ await deferred . wait ( ) ;
8585
8686 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
8787
8888 deferred ( ) ;
8989
90- await Promise . resolve ( ) ;
90+ await deferred . wait ( ) ;
9191
9292 expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
9393 } ) ;
@@ -104,8 +104,49 @@ describe('defer', () => {
104104
105105 expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
106106
107- await Promise . resolve ( ) ;
107+ await deferred . wait ( ) ;
108108
109109 expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
110110 } ) ;
111+
112+ it ( 'throws an error when `wait` is called before the deferred function' , ( ) => {
113+ const fn = jest . fn ( ) ;
114+ const deferred = defer ( fn ) ;
115+
116+ expect ( ( ) => deferred . wait ( ) ) . toThrowErrorMatchingInlineSnapshot (
117+ `"The deferred function should be called before calling \`wait()\`"`
118+ ) ;
119+ } ) ;
120+
121+ it ( 'recovers a deferred function that throws an error' , async ( ) => {
122+ const fn = jest . fn ( ) ;
123+ const deferred = defer ( fn ) ;
124+
125+ fn . mockImplementation ( ( ) => {
126+ throw new Error ( 'FAIL' ) ;
127+ } ) ;
128+
129+ deferred ( ) ;
130+
131+ expect ( fn ) . toHaveBeenCalledTimes ( 0 ) ;
132+
133+ try {
134+ await deferred . wait ( ) ;
135+ } catch {
136+ // The test verifies that the function is able to recover. We don't want
137+ // to terminate the test on this expected error.
138+ }
139+
140+ expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
141+
142+ fn . mockImplementation ( ) ;
143+
144+ deferred ( ) ;
145+
146+ expect ( fn ) . toHaveBeenCalledTimes ( 1 ) ;
147+
148+ await deferred . wait ( ) ;
149+
150+ expect ( fn ) . toHaveBeenCalledTimes ( 2 ) ;
151+ } ) ;
111152} ) ;
0 commit comments