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