Mocha / Chai si aspettano che non vengano rilevati errori generati


259

Ho problemi a far funzionare Chai expect.to.throwin un test per la mia app node.js. Il test continua a fallire sull'errore generato, ma se avvolgo il caso di prova nel tentativo di rilevare e affermare l'errore rilevato, funziona.

Non expect.to.throwfunziona come penso che dovrebbe o qualcosa del genere?

it('should throw an error if you try to get an undefined property', function (done) {
  var params = { a: 'test', b: 'test', c: 'test' };
  var model = new TestModel(MOCK_REQUEST, params);

  // neither of these work
  expect(model.get('z')).to.throw('Property does not exist in model schema.');
  expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));

  // this works
  try { 
    model.get('z'); 
  }
  catch(err) {
    expect(err).to.eql(new Error('Property does not exist in model schema.'));
  }

  done();
});

Il fallimento:

19 passing (25ms)
  1 failing

  1) Model Base should throw an error if you try to get an undefined property:
     Error: Property does not exist in model schema.

Risposte:


340

Devi passare una funzione a expect. Come questo:

expect(model.get.bind(model, 'z')).to.throw('Property does not exist in model schema.');
expect(model.get.bind(model, 'z')).to.throw(new Error('Property does not exist in model schema.'));

Il modo in cui si sta facendo, si passa al expectil risultato della chiamata model.get('z'). Ma per verificare se viene lanciato qualcosa, devi passare una funzione expect, che expectchiamerà se stessa. Il bindmetodo usato sopra crea una nuova funzione che quando chiamata chiamerà model.getcon thisset al valore di modele il primo argomento impostato su 'z'.

Una buona spiegazione di bindpuò essere trovata qui .


Ho passato una funzione, no? modelL'istanza ha una funzione chiamata get che ho passato / chiamato in wait.
Doremi,

No, vedi la spiegazione che ho aggiunto mentre stavi scrivendo il tuo commento.
Louis,

47
Oof. Perché i documenti ( chaijs.com/api/bdd/#throw ) non dimostrano questo uso di bind? Sembra che lo scenario di test più comune to.throwsia il test di una particolare condizione all'interno di una funzione, che richiede di chiamare quella funzione con lo stato / argomenti non validi. (Del resto .... perché i deeplink di chaijs.com non sono in realtà deeplink?)
ericsoco

Quando si superano alcuni parametri che non devono essere lanciati, il test è comunque un passaggio.
Alexandros Spyropoulos,

6
Nota che non funzionerà (a partire da settembre 2017) per le funzioni asincrone: vedi github.com/chaijs/chai/issues/882#issuecomment-322131680 e la discussione associata.
ChrisV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.