2013-02-25 31 views
12

Sto usando Mocha per testare una funzione asincrona che restituisce una promessa.Come verificare le promesse con Mocha

Qual è il modo migliore per verificare che la promessa si risolva al valore corretto?

+0

crea una funzione che accetta "it" e restituisce una funzione chiamata al posto di quella che fa tutto ciò automaticamente. La tua funzione di test dovrà iniziare con 'return getSomePromise()' –

+0

"Quando questa asserzione fallisce, viene inghiottita". Per chiarire, l'eccezione che i lanci di 'value.should.equal' viene catturata dalla funzione che chiama il callback" success ". Questa è una funzionalità di Promises/A + per garantire che sia sempre possibile gestire eventuali errori (eccezioni o altro) nel callback "fallito" alla fine della catena di promesse. –

risposta

7

Mocha è dotato di supporto Promessa a partire dalla versione 1.18.0 (Marzo 2014). È possibile restituire una promessa da un banco di prova, e Mocha sarà attendere che:

it('does something asynchronous', function() { // note: no `done` argument 
    return getSomePromise().then(function(value) { 
    expect(value).to.equal('foo'); 
    }); 
}); 

Non dimenticate la parola chiave return sulla seconda riga. Se lo ometti accidentalmente, Mocha supporrà che il test sia sincrono e non attenderà la funzione .then, quindi il test passerà sempre anche quando l'asserzione fallisce.


Se questo diventa troppo ripetitiva, si consiglia di utilizzare la libreria chai-as-promised, che vi dà una proprietà eventually per testare le promesse più facilmente:

it('does something asynchronous', function() { 
    return expect(getSomePromise()).to.eventually.equal('foo'); 
}); 

it('fails asynchronously', function() { 
    return expect(getAnotherPromise()).to.be.rejectedWith(Error, /some message/); 
}); 

Anche in questo caso, non dimenticate la parola chiave return !

+0

Scusa se non capisco, ho un semplice test 'browser.url (..); title = browser.getTitle(); expect (title) .to.equal ('foo'); 'Come userò il' getPromise() 'nel mio caso? – Gobliins

4

Quindi "restituisce" una promessa che può essere utilizzata per gestire l'errore. La maggior parte delle librerie supporta un metodo chiamato done che si assicura che vengano lanciati eventuali errori non gestiti.

it('does something asynchronous', function (done) { 
    getSomePromise() 
    .then(function (value) { 
     value.should.equal('foo') 
    }) 
    .done(() => done(), done); 
}); 

È possibile anche usare qualcosa come mocha-as-promised (ci sono le librerie simili per altri framework di test). Se si sta eseguendo lato server:

npm install mocha-as-promised 

Poi all'inizio del vostro script:

require("mocha-as-promised")(); 

Se si sta eseguendo lato client:

<script src="mocha-as-promised.js"></script> 

poi dentro i test si può solo restituire la promessa:

it('does something asynchronous', function() { 
    return getSomePromise() 
    .then(function (value) { 
     value.should.equal('foo') 
    }); 
}); 

O nel caffè-script (secondo il vostro esempio originale)

it 'does something asynchronous',() -> 
    getSomePromise().then (value) => 
    value.should.equal 'foo' 
Problemi correlati