2017-10-17 7 views
0

Je pense que mocha cesse de fonctionner le cas de test courant après assertion échoue, comme celui-cicontrôle de flux Mocha après assertion échoue

it('test', function(done) { 
    a.should.equal(b); 
    //if a is not equal to be, won't go here 
    //do something 
    done(); 
} 

je dois continuer à faire quelque chose après assertion échoue, j'ai essayé d'utiliser try ... catch , mais il n'y a pas « d'autre » pour combler le retard, donc si je

try { 
    a.should.equal(b) 
} catch(e) { 
    console.log(e) 
    done(e) 
} finally { 
    //do something 
    done() 
} 

cela fait appel() deux fois, donc je dois ajouter un drapeau,

var flag = true; 
try { 
    a.should.equal(b) 
} catch(e) { 
    console.log(e) 
    flag = false 
    done(e) 
} finally { 
    //do something 
    if(flag) 
     done() 
} 

Je pense que c'est si compliqué, donc je me demande s'il y a un moyen plus facile de le faire?

Répondre

0

Un crochet after sera toujours déclenchée lorsqu'un test échoue, vous pouvez placer votre test dans un contexte qui a un tel crochet:

describe('suite', function() { 

    after(function(done) { 
    // do something 
    done(); 
    }); 

    it('test', function(done) { 
    a.should.equal(b); 
    done(); 
    } 

}); 
+0

en fait je voudrais le faire après chaque cas de test se termine, donc je peux utiliser afterEach(), mais le "faire quelque chose" diffère de chaque cas de test, donc je ne pense pas que je peux l'utiliser. – Keming

+0

@KemingZeng vous pouvez imbriquer les blocs 'describe', donc vous pouvez en créer un pour chaque test, et avoir un crochet' after' pour chacun. – robertklep

+0

J'utilise un autre moyen de le faire, mais je pense qu'après le crochet devrait être une bonne solution à cela. Je vous remercie! – Keming

0

La raison pour laquelle il est appelé deux fois parce que le catch est la manipulation à l'exception, mais le bloc finally sera toujours exécuter, peu importe si l'affirmation renvoie une erreur.

Utilisez return pour gérer votre scénario - si une exception est détectée, elle retournera avec l'erreur, sinon elle ignorera la capture et return done().

try { 
    // test assertion 
    a.should.equal(b) 
} catch(e) { 
    // catch the error and return it 
    console.log(e) 
    return done(e) 
} 
// just return normally 
return done() 

Si vous avez besoin de l'utiliser dans un scénario if/else, vous pouvez le gérer avec une variable.

var theError = false; 
try { 
    // test assertion 
    a.should.equal(b) 
} catch(e) { 
    // indicate we caught an error 
    console.log(e) 
    theError = e 
} 

if (theError) { 
    // there was an exception 
    done(theError) 
} else { 
    // no exceptions! 
    done() 
} 
+0

Merci, je pense que le premier serait plus facile. Alors moka n'a rien pour ça? – Keming

+0

Mocha a quelque chose pour cela - voir les deux exemples :) C'est juste une bibliothèque comme toute autre chose, vous devez encore écrire javascript autour d'elle. – doublesharp

+0

Je voulais que mes deux exemples soient valides, mais chacun pourrait être plus approprié en fonction de la situation spécifique. Vous devrez concevoir pour vos besoins spécifiques. – doublesharp

0

Rappelez-vous que le dernier sera exécuté, il échoue ou n'échoue pas. C'est pourquoi il exécute le fait deux fois.

You can do: 

    try { 
     a.should.equal(b) 
    } catch(e) { 
     console.log(e) 
     done(e) 
    } 
    done() 

En cas d'échec, vous sortirez par le crochet, sinon vous continuez et vous revenez normalement.