Maison  >  Article  >  interface Web  >  Pourquoi mon assertion Mocha/Chai `expect.to.throw` ne parvient-elle pas à détecter les erreurs générées ?

Pourquoi mon assertion Mocha/Chai `expect.to.throw` ne parvient-elle pas à détecter les erreurs générées ?

DDD
DDDoriginal
2024-11-18 03:02:02417parcourir

Why Does My Mocha/Chai `expect.to.throw` Assertion Fail to Catch Thrown Errors?

Mocha/Chai Expect.to.throw Puzzle : attraper les erreurs lancées

L'affirmation Expect.to.throw de Chai semble être insaisissable pour attraper erreurs générées correctement. Malgré l'écriture de cas de test, les assertions avec expect.to.throw échouent à plusieurs reprises.

Pour clarifier, considérons l'extrait de code suivant :

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);

  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.'));
});

En fin de compte, le nœud du problème Le problème réside dans la manière dont nous transmettons l'expression à expect.to.throw.

La solution : envelopper le Fonction

Pour remédier à ce problème, nous devons passer une fonction à expect.to.throw, qu'elle invoquera ensuite. Le code ajusté suivant fonctionnera désormais comme prévu :

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);

  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.'));
});

En utilisant la méthode bind, nous créons une nouvelle fonction qui, lorsqu'elle est appelée, évoquera model.get avec cet ensemble à model et l'ensemble d'arguments initial à 'z'.

Explication de la liaison

Dans ce contexte, la liaison joue un rôle crucial. Il génère une nouvelle fonction qui accepte les mêmes arguments que l'original mais avec une valeur spécifique pour cela lorsqu'il est invoqué. Dans notre cas, cette valeur est model et l'argument est 'z'.

Lorsque nous transmettons le résultat de model.get('z') à expect.to.throw, nous transmettons essentiellement le résultat lancé erreur dans l'affirmation. Cependant, le but de expect.to.throw est de vérifier si une exception est levée par une fonction donnée lorsqu'elle est appelée. Il faut donc transmettre la fonction elle-même plutôt que son résultat. La méthode bind nous permet de faire exactement cela.

Pour une analyse plus approfondie de la liaison, reportez-vous au lien fourni.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn