@@ -18,6 +18,16 @@ const injectHook = function (inject, suite) {
1818 return recorder . promise ( ) ;
1919} ;
2020
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+ }
2131/**
2232 * Wraps test function, injects support objects from container,
2333 * starts promise chain with recorder, performs before/after hooks
@@ -34,56 +44,44 @@ module.exports.test = (test) => {
3444 test . async = true ;
3545
3646 test . fn = function ( done ) {
47+ const doneFn = makeDoneCallableOnce ( done ) ;
3748 recorder . errHandler ( ( err ) => {
3849 recorder . session . start ( 'teardown' ) ;
3950 recorder . cleanAsyncErr ( ) ;
40- if ( test . throws ) { // check that test should actually fail
51+ if ( test . throws ) {
52+ // check that test should actually fail
4153 try {
4254 assertThrown ( err , test . throws ) ;
4355 event . emit ( event . test . passed , test ) ;
4456 event . emit ( event . test . finished , test ) ;
45- recorder . add ( ( ) => done ( ) ) ;
57+ recorder . add ( doneFn ) ;
4658 return ;
4759 } catch ( newErr ) {
4860 err = newErr ;
4961 }
5062 }
5163 event . emit ( event . test . failed , test , err ) ;
5264 event . emit ( event . test . finished , test ) ;
53- recorder . add ( ( ) => done ( err ) ) ;
65+ recorder . add ( ( ) => doneFn ( err ) ) ;
5466 } ) ;
5567
5668 if ( isAsyncFunction ( testFn ) ) {
5769 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 ( ) ;
6884 } ) ;
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 ) ;
8785 return ;
8886 }
8987
@@ -97,7 +95,7 @@ module.exports.test = (test) => {
9795 event . emit ( event . test . passed , test ) ;
9896 event . emit ( event . test . finished , test ) ;
9997 } ) ;
100- recorder . add ( 'finish test' , ( ) => done ( ) ) ;
98+ recorder . add ( 'finish test' , doneFn ) ;
10199 recorder . catch ( ) ;
102100 }
103101 } ;
@@ -109,13 +107,14 @@ module.exports.test = (test) => {
109107 */
110108module . exports . injected = function ( fn , suite , hookName ) {
111109 return function ( done ) {
110+ const doneFn = makeDoneCallableOnce ( done ) ;
112111 const errHandler = ( err ) => {
113112 recorder . session . start ( 'teardown' ) ;
114113 recorder . cleanAsyncErr ( ) ;
115114 event . emit ( event . test . failed , suite , err ) ;
116115 if ( hookName === 'after' ) event . emit ( event . test . after , suite ) ;
117116 if ( hookName === 'afterSuite' ) event . emit ( event . suite . after , suite ) ;
118- recorder . add ( ( ) => done ( err ) ) ;
117+ recorder . add ( ( ) => doneFn ( err ) ) ;
119118 } ;
120119
121120 recorder . errHandler ( ( err ) => {
@@ -137,28 +136,32 @@ module.exports.injected = function (fn, suite, hookName) {
137136 const opts = suite . opts || { } ;
138137 const retries = opts [ `retry${ ucfirst ( hookName ) } ` ] || 0 ;
139138
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+ }
151152 }
152- }
153- } , { retries } )
153+ } ,
154+ { retries } ,
155+ )
154156 . then ( ( ) => {
155157 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 ) ;
157159 recorder . catch ( ) ;
158- } ) . catch ( ( e ) => {
160+ } )
161+ . catch ( ( e ) => {
159162 recorder . throw ( e ) ;
160163 recorder . catch ( ( e ) => {
161- const err = ( recorder . getAsyncErr ( ) === null ) ? e : recorder . getAsyncErr ( ) ;
164+ const err = recorder . getAsyncErr ( ) === null ? e : recorder . getAsyncErr ( ) ;
162165 errHandler ( err ) ;
163166 } ) ;
164167 recorder . add ( 'fire hook.failed' , ( ) => event . emit ( event . hook . failed , suite , e ) ) ;
0 commit comments