2015-06-16 7 views
12

Ho il seguente test:Come arrivare Mocha a fallire una prova

it.only('validation should fail', function(done) { 
    var body = { 
     title: "dffdasfsdfsdafddfsadsa", 
     description: "Postman Description", 
     beginDate: now.add(3, 'd').format(), 
     endDate: now.add(4, 'd').format() 
    } 


    var rules = eventsValidation.eventCreationRules(); 
    var valMessages = eventsValidation.eventCreationMessages(); 

    indicative 
     .validateAll(rules, body, valMessages) 
     .then(function(data) { 
      console.log("SHOULD NOT GET HERE"); 
      should.fail("should not get here"); 
      done(); 

     }) 
     .catch(function(error) { 
      console.log("SHOULD GET HERE"); 
      console.log(error); 
     }); 
    done(); 
}); 

Il test percorso di esecuzione è corretta. Quando ho dati di convalida, va a "NON DEVE ARRIVARE QUI". Il test è davvero per assicurarsi che non lo faccia. E quando inserisco dati non validanti, il codice va su "DOVRESTI RICEVI QUI". Quindi funzionano le regole di validazione.

Quello che sto cercando di fare è assicurarsi che il test fallisca quando ho dati di validazione errati e lo convalida. Tuttavia, quando lo eseguo come è con i dati validi, convalida, esegue il fail, ma la mocha lo segna ancora come il passaggio. Voglio che fallisca se l'esecuzione arriva a "NON DEVI ARRIVARE QUI".

Ho provato a lanciare un nuovo errore ("errore"); anche senza fortuna. In entrambi i casi sembra che il codice venga eseguito anche nel blocco .catch.

Qualche suggerimento? Ho trovato soluzioni per questo in un similar question. Questa domanda è scritta perché quelle soluzioni non sembrano funzionare per me.

+0

possibile duplicato del [test di Forza Mocha fallire?] (http://stackoverflow.com/questions/14879181/force-mocha-test-to-fail) – aug

+0

chiama il callback fatto solo nella funzione 'then' rimuovi la funzione outer done, perché quando arriverà alla funzione catch non ci sarà alcuna richiamata, quindi mostrerà automaticamente l'errore di timeout sin da ora dato che stai solo consolando l'esterno fatto sta passando tutto il test –

risposta

7

Utilizzare chai-as-promised, con gestori di promesse Mocha nativi.

var chai = require('chai').use(require('chai-as-promised')); 
var should = chai.should(); // This will enable .should for promise assertions 

Non è più necessario done, semplicemente restituire la promessa.

// Remove `done` from the line below 
it.only('validation should fail', function(/* done */) { 
    var body = { 
     title: "dffdasfsdfsdafddfsadsa", 
     description: "Postman Description", 
     beginDate: now.add(3, 'd').format(), 
     endDate: now.add(4, 'd').format() 
    } 

    var rules = eventsValidation.eventCreationRules(); 
    var valMessages = eventsValidation.eventCreationMessages(); 

    // Return the promise 
    return indicative 
     .validateAll(rules, body, valMessages) 
     .should.be.rejected; // The test will pass only if the promise is rejected 

    // Remove done, we no longer need it 
    // done(); 
}); 
13

È possibile chiamare assert.fail:

it("should return empty set of tags", function() 
{ 
    assert.fail("actual", "expected", "Error message"); 
}); 

Inoltre, Mocha considera il test è riuscito se si chiama la funzione done() con un parametro.

Ad esempio:

it("should return empty set of tags", function(done) 
{ 
    done(new Error("Some error message here")); 
}); 

Anche se il primo sembra più chiaro per me.

+0

Non c'è assolutamente alcun motivo per risolvere il problema dell'OP in questo modo piuttosto che usare la risposta accettata. – Louis

+5

@Louis Stai parlando della risposta accettata che consiglia di aggiungere chai come un'altra dipendenza? Limitare le dipendenze sembra una valida ragione. – ken

+0

@ken L'OP utilizza promesse. Quindi la soluzione dovrebbe sfruttare il fatto che Mocha capisce le promesse.La metà delle domande poste in [tag: moka] in questi giorni sono dovuti a problemi causati da qualche insistenza da usare 'done' quando tutto potrebbe essere semplificata da solo utilizzando le promesse già generate dal codice testato. Perché, vedi, mentre è * possibile * usare 'done' con delle promesse, viene fornito con alcuni * significativi trucchi * che la risposta qui * omette *. Per quanto riguarda le dipendenze, non appena si supera il codice del giocattolo, avere una dipendenza da "chai-as-promise" non è un grosso problema. – Louis

1

Nel ES2017 async/await world chai-as-promised non è necessario. Anche se semplici rifiuti sono un luogo chai-as-promised rimane un po 'più ordinato da usare, è necessario installare questo seguente configurazione, se si desidera verificare l'errore in modo più dettagliato

it.only('validation should fail', async function(){ 
    let body = { ... } 
    let rules = eventsValidation.eventCreationRules() 
    let valMessages = eventsValidation.eventCreationMessages() 

    try { 
     await indicative.validateAll(rules, body, valMessages) 
    } catch (error) { 
     return expect(error).to.be.instanceOf(Error) 
    } 
    expect.fail(null, null, 'validateAll did not reject with an error') 
    // or throw new Error('validateAll did not reject with an error') 
}) 

esigenze Node.js 7.6+ o Babel