web-dev-qa-db-fra.com

Testez un rejet avec Chai comme promis

Je veux tester une fonction renvoyant une promesse.

Dans ce test particulier, la promesse devrait être rejetée avec un objet Error contenant le champ classique message (dans ce test, il devrait être égal à "my error message") et un champ personnalisé que j'ai ajouté nommé code, qui est une chaîne (comme "EACCESS", "ERIGHT", etc., dans ce test, il devrait être égal à "EFOO")

Je veux utiliser le chai comme promis pour cela.

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

Cette assertion fonctionne mais maintenant je voudrais également tester le champ code.
Comment faire ça?

32
Guid

Si vous utilisez Chai-As-Promised (comme vous le dites), cela permet de chaîner rejectedWith - et définit l'objet d'assertion de chaîne comme étant l'erreur objet - ce qui signifie quelque chose après rejectedWith() va maintenant affirmer sur l'erreur. Cela vous permet de faire des choses intéressantes comme:

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

Certaines des méthodes chai chaînent également, vous pouvez donc l'utiliser pour faire des assertions imbriquées assez profondément sur l'erreur:

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

Ayant la version 5.1.0 de ChaiAsPromised, la solution de Keithamus ne fonctionnait pas pour moi - rejetéWith ne m'a pas donné l'objet d'erreur à affirmer, mais "rejeté":

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

Pour affirmer plusieurs propriétés

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');
    });
31
Markko Paas

La solution de @Markko Paas n'a pas fonctionné pour moi jusqu'à ce que j'ajoute "éventuellement", sinon la valeur rejetée est toujours {} un objet vide.

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

Vous pouvez effectuer des tests complexes sur les erreurs à l'aide de rejected.then:

it('throws a complex error', function () {
  return expect(foo()).to.eventually.be.rejected.then((error) => {
    expect(error.code).to.equal('expected code');
    // other tests
    // alternatively,
    expect (error).to.eql({
      foo: 'foo',
      bar: 'bar
    });
  });
});
1
Rich Apodaca