2015-03-31 15 views
19

Voglio testare una funzione che restituisce una promessa.Testare un rifiuto con Chai come promesso

In questo particolare test, ci si aspetta la promessa di essere respinto con un oggetto di errore contenente il message campo classica (in questo test, ci si aspetta di eguagliare "my error message") ed un campo personalizzato ho aggiunto il nome code, che è una stringa (come "EACCESS", "ERIGHT", ecc., in questo test è previsto pari a "EFOO")

Voglio usare chai-come-promesso per quello.

return expect(foo()).to.eventually.be.rejectedWith("my error message"); 

Questa affermazione sta funzionando, ma ora vorrei provare il campo code troppo.
Come si fa?

+1

duplicato per [test per le proprietà specifiche di promesse respinti] (http://stackoverflow.com/questions/23985949/testing-for-specific-properties-of-rejected-promises-with-mocha-and- chai-as-pro) –

risposta

24

Se stai usando Chai-As-Promised (come dici di essere), quindi permette per il concatenamento di fuori rejectedWith - e imposta l'oggetto della catena asserzione di essere l'oggetto di errore - significa nulla dopo rejectedWith() sta ora a far valere il l'errore. Questo ti permette di fare cose interessanti come:

return expect(foo()).to.eventually 
    .be.rejectedWith("my error message") 
    .and.be.an.instanceOf(Error) 
    .and.have.property('code', 'EFOO'); 

Alcuni dei metodi chai anche a catena, in modo da poter utilizzare che per fare alcune affermazioni abbastanza profondamente nidificate sull'errore:

return expect(foo()).to.eventually 
    .be.rejectedWith("my error message") 
    .and.have.property('stack') 
    .that.includes('myfile.js:30') 
+2

per qualche motivo questo non funziona per me. non importa cosa faccio la stringa del messaggio di errore che passa sempre. – chovy

+0

@chovy puoi incollare il codice del metodo di foo(). Puoi verificare il tuo sistema sotto test (metodo) se stai usando la dichiarazione di reso e nel gestore di rifiuto, se rifiuti esplicitamente ... altrimenti le promesse saranno considerate come risolte. –

+0

'pippo()' restituiva un '$ q.defer(). Promise' - apparentemente chai-as-promise ha problemi con' $ q' di angular. – chovy

28

Avere versione 5.1. 0 di ChaiAsPromised, soluzione da Keithamus non ha funzionato per me - rejectedWith non mi ha dato l'oggetto di errore di affermare, ma "rifiutato" ha fatto:

return expect(foo()) 
    .to.be.rejected 
    .and.be.an.instanceOf(Error) 
    .and.have.property('code', 'EFOO'); 

per far valere più proprietà

return expect(foo()) 
    .to.be.rejected 
    .then(function(error) { 
     expect(error).to.have.property('name', 'my error message'); 
     expect(error).to.have.property('code', 'EFOO'); 
    });