@@ -18,6 +18,16 @@ const injectHook = function (inject, suite) {
18
18
return recorder . promise ( ) ;
19
19
} ;
20
20
21
+ function makeDoneCallableOnce ( done ) {
22
+ let called = false ;
23
+ return function ( err ) {
24
+ if ( called ) {
25
+ return ;
26
+ }
27
+ called = true ;
28
+ return done ( err ) ;
29
+ } ;
30
+ }
21
31
/**
22
32
* Wraps test function, injects support objects from container,
23
33
* starts promise chain with recorder, performs before/after hooks
@@ -34,56 +44,44 @@ module.exports.test = (test) => {
34
44
test . async = true ;
35
45
36
46
test . fn = function ( done ) {
47
+ const doneFn = makeDoneCallableOnce ( done ) ;
37
48
recorder . errHandler ( ( err ) => {
38
49
recorder . session . start ( 'teardown' ) ;
39
50
recorder . cleanAsyncErr ( ) ;
40
- if ( test . throws ) { // check that test should actually fail
51
+ if ( test . throws ) {
52
+ // check that test should actually fail
41
53
try {
42
54
assertThrown ( err , test . throws ) ;
43
55
event . emit ( event . test . passed , test ) ;
44
56
event . emit ( event . test . finished , test ) ;
45
- recorder . add ( ( ) => done ( ) ) ;
57
+ recorder . add ( doneFn ) ;
46
58
return ;
47
59
} catch ( newErr ) {
48
60
err = newErr ;
49
61
}
50
62
}
51
63
event . emit ( event . test . failed , test , err ) ;
52
64
event . emit ( event . test . finished , test ) ;
53
- recorder . add ( ( ) => done ( err ) ) ;
65
+ recorder . add ( ( ) => doneFn ( err ) ) ;
54
66
} ) ;
55
67
56
68
if ( isAsyncFunction ( testFn ) ) {
57
69
event . emit ( event . test . started , test ) ;
58
-
59
- const catchError = e => {
60
- recorder . throw ( e ) ;
61
- recorder . catch ( ( e ) => {
62
- const err = ( recorder . getAsyncErr ( ) === null ) ? e : recorder . getAsyncErr ( ) ;
63
- recorder . session . start ( 'teardown' ) ;
64
- recorder . cleanAsyncErr ( ) ;
65
- event . emit ( event . test . failed , test , err ) ;
66
- event . emit ( event . test . finished , test ) ;
67
- recorder . add ( ( ) => done ( err ) ) ;
70
+ testFn
71
+ . call ( test , getInjectedArguments ( testFn , test ) )
72
+ . then ( ( ) => {
73
+ recorder . add ( 'fire test.passed' , ( ) => {
74
+ event . emit ( event . test . passed , test ) ;
75
+ event . emit ( event . test . finished , test ) ;
76
+ } ) ;
77
+ recorder . add ( 'finish test' , doneFn ) ;
78
+ } )
79
+ . catch ( ( err ) => {
80
+ recorder . throw ( err ) ;
81
+ } )
82
+ . finally ( ( ) => {
83
+ recorder . catch ( ) ;
68
84
} ) ;
69
- } ;
70
-
71
- let injectedArguments ;
72
- try {
73
- injectedArguments = getInjectedArguments ( testFn , test ) ;
74
- } catch ( e ) {
75
- catchError ( e ) ;
76
- return ;
77
- }
78
-
79
- testFn . call ( test , injectedArguments ) . then ( ( ) => {
80
- recorder . add ( 'fire test.passed' , ( ) => {
81
- event . emit ( event . test . passed , test ) ;
82
- event . emit ( event . test . finished , test ) ;
83
- } ) ;
84
- recorder . add ( 'finish test' , ( ) => done ( ) ) ;
85
- recorder . catch ( ) ;
86
- } ) . catch ( catchError ) ;
87
85
return ;
88
86
}
89
87
@@ -97,7 +95,7 @@ module.exports.test = (test) => {
97
95
event . emit ( event . test . passed , test ) ;
98
96
event . emit ( event . test . finished , test ) ;
99
97
} ) ;
100
- recorder . add ( 'finish test' , ( ) => done ( ) ) ;
98
+ recorder . add ( 'finish test' , doneFn ) ;
101
99
recorder . catch ( ) ;
102
100
}
103
101
} ;
@@ -109,13 +107,14 @@ module.exports.test = (test) => {
109
107
*/
110
108
module . exports . injected = function ( fn , suite , hookName ) {
111
109
return function ( done ) {
110
+ const doneFn = makeDoneCallableOnce ( done ) ;
112
111
const errHandler = ( err ) => {
113
112
recorder . session . start ( 'teardown' ) ;
114
113
recorder . cleanAsyncErr ( ) ;
115
114
event . emit ( event . test . failed , suite , err ) ;
116
115
if ( hookName === 'after' ) event . emit ( event . test . after , suite ) ;
117
116
if ( hookName === 'afterSuite' ) event . emit ( event . suite . after , suite ) ;
118
- recorder . add ( ( ) => done ( err ) ) ;
117
+ recorder . add ( ( ) => doneFn ( err ) ) ;
119
118
} ;
120
119
121
120
recorder . errHandler ( ( err ) => {
@@ -137,28 +136,32 @@ module.exports.injected = function (fn, suite, hookName) {
137
136
const opts = suite . opts || { } ;
138
137
const retries = opts [ `retry${ ucfirst ( hookName ) } ` ] || 0 ;
139
138
140
- promiseRetry ( async ( retry , number ) => {
141
- try {
142
- recorder . startUnlessRunning ( ) ;
143
- await fn . call ( this , getInjectedArguments ( fn ) ) ;
144
- await recorder . promise ( ) . catch ( err => retry ( err ) ) ;
145
- } catch ( err ) {
146
- retry ( err ) ;
147
- } finally {
148
- if ( number < retries ) {
149
- recorder . stop ( ) ;
150
- recorder . start ( ) ;
139
+ promiseRetry (
140
+ async ( retry , number ) => {
141
+ try {
142
+ recorder . startUnlessRunning ( ) ;
143
+ await fn . call ( this , getInjectedArguments ( fn ) ) ;
144
+ await recorder . promise ( ) . catch ( ( err ) => retry ( err ) ) ;
145
+ } catch ( err ) {
146
+ retry ( err ) ;
147
+ } finally {
148
+ if ( number < retries ) {
149
+ recorder . stop ( ) ;
150
+ recorder . start ( ) ;
151
+ }
151
152
}
152
- }
153
- } , { retries } )
153
+ } ,
154
+ { retries } ,
155
+ )
154
156
. then ( ( ) => {
155
157
recorder . add ( 'fire hook.passed' , ( ) => event . emit ( event . hook . passed , suite ) ) ;
156
- recorder . add ( `finish ${ hookName } hook` , ( ) => done ( ) ) ;
158
+ recorder . add ( `finish ${ hookName } hook` , doneFn ) ;
157
159
recorder . catch ( ) ;
158
- } ) . catch ( ( e ) => {
160
+ } )
161
+ . catch ( ( e ) => {
159
162
recorder . throw ( e ) ;
160
163
recorder . catch ( ( e ) => {
161
- const err = ( recorder . getAsyncErr ( ) === null ) ? e : recorder . getAsyncErr ( ) ;
164
+ const err = recorder . getAsyncErr ( ) === null ? e : recorder . getAsyncErr ( ) ;
162
165
errHandler ( err ) ;
163
166
} ) ;
164
167
recorder . add ( 'fire hook.failed' , ( ) => event . emit ( event . hook . failed , suite , e ) ) ;
0 commit comments