2016-04-11 4 views
0

J'essaie de mettre en place des tests in-browser en utilisant Mocha 2.4.5 et .Comment corriger le formatage d'erreur mocha en assertion asynchrone

Échec Les assertions doivent-elles indiquer une raison d'échec de test utile.
Toutefois, lorsque cette même assertion est effectuée dans le contexte d'un rappel jQuery Ajax, j'obtiens une erreur d'assertion non asservie à la place.

Prenons l'exemple suivant:

mocha.setup('bdd'); 
var url = 'http://localhost/api/v2/People'; 
describe('ajax',() => { 
    var that1 = this; 
    it('Passing async assertion', (done) => { 
     $.ajax({ url: url }).done(data => { 
      should(1).be.eql(1); 
      done(); 
     }); 
    }); 
    it('Failing async assertion', (done) => { 
     var that2 = this; 
     $.ajax({ url: url }).done(data => { 
      should(0).be.eql(1); 
      done(); 
     }); 
    }); 
    it('Failing sync assertion', (done) => { 
     should(0).be.eql(1); 
     done(); 
    }); 
}); 
mocha.run(); 

Passing affirmation async 'passe et semble assez dans la sortie du lanceur de test.

'affirmation défaut de synchronisation' échoue et je reçois un stacktrace utile

Fail sync assertion ‣
AssertionError: expected 0 to equal 1
at Assertion.fail (http://path/to/should.js:220:17)
at Assertion.Object.defineProperty.value (http://path/to/should.js:292:19)
at Context. (tests.js:337:26)

Cependant, 'A défaut affirmation async' échoue (ce qui est bien), mais le stacktrace est usless.

Fail async assertion ‣
Error: Uncaught AssertionError (http://path/to/should.js:200)

J'ai joué avec la définition du contexte ajax à que1 ou que2, mais il ne fait aucune différence. Y a-t-il un autre moyen de formater les cas de test afin que les assertions asynchrones fonctionnent?

EDIT

Je reçois la même chose en utilisant un délai d'attente simple pour simuler l'asynchronisme

mocha.setup('bdd'); 
describe('ajax',() => { 
    var that1 = this; 
    it('Failing async assertion', (done) => { 
     setTimeout(() => { 
      should(0).be.eql(1); 
      done(); 
     }, 100); 
    }).async = true; 
    it('Failing sync assertion', (done) => { 
     should(0).be.eql(1); 
     done(); 
    }); 
}); 
mocha.run(); 

Répondre

0

Les docs pour Mocha suggère le formatage des tests asynchrones que j'ai dans ma question, mais je pense que les Les documents sont écrits en pensant au coureur de test Node.js.

Dans le navigateur, il apparaît qu'il est nécessaire d'exécuter du code asynchrone dans la fonction 'before', puis de faire des assertions synchrones basées sur une valeur stockée.

Par exemple:

mocha.setup('bdd'); 
describe('ajax',() => { 
    var value = 0; 
    before((done) => { 
     //Do the asynchronous bit 
     setTimeout(() => { 
      //store the value for later comparison 
      value = 1; 
      done(); 
     }, 100); 
    }); 
    //These wont be called until after done() is called above. 
    //So value will be 1 
    it('Failing assertion',() => { 
     should(value).be.eql(0); 
    }); 
    it('Passing assertion',() => { 
     should(value).be.eql(1); 
    }); 
}); 
mocha.run(); 

L'avantage ici est que Mocha drapeau coutume les affirmations que async lent en raison de facteurs externes (comme la latence du réseau).