2017-09-19 9 views
1

J'aimerais que mes tests unitaires affirment qu'un appel de fonction particulier déclenche une erreur AssertionError spécifiquement quand il est attendu, plutôt que de lancer une exception. La bibliothèque d'assertion (expect) supporte une telle chose en passant un constructeur d'exceptions, mais je n'arrive pas à trouver où, si n'importe où, le constructeur AssertionError est exporté. Est-il destiné à être une classe interne seulement et non exposée à nous? The docs contient de nombreuses références, mais pas de liens.Où est définie AssertionError dans Node.js?

J'ai un moyen super aki:

let AssertionError; 

try { 
    const assert = require("assert"); 

    assert.fail(); 
} 
catch (ex) { 
    AssertionError = ex.constructor; 
} 

mais j'espère qu'il ya une meilleure façon.

Répondre

0

Après une recherche dans le repo github NodeJS, je peux vous dire qu'il est ici: https://github.com/nodejs/node/blob/c75f87cc4c8d3699e081d37bb5bf47a70d830fdb/lib/internal/errors.js

AssertionError est défini comme ceci:

class AssertionError extends Error { 
 
    constructor(options) { 
 
    if (typeof options !== 'object' || options === null) { 
 
     throw new exports.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object'); 
 
    } 
 
    var { actual, expected, message, operator, stackStartFunction } = options; 
 
    if (message) { 
 
     super(message); 
 
    } else { 
 
     if (actual && actual.stack && actual instanceof Error) 
 
     actual = `${actual.name}: ${actual.message}`; 
 
     if (expected && expected.stack && expected instanceof Error) 
 
     expected = `${expected.name}: ${expected.message}`; 
 
     if (util === null) util = require('util'); 
 
     super(`${util.inspect(actual).slice(0, 128)} ` + 
 
     `${operator} ${util.inspect(expected).slice(0, 128)}`); 
 
    } 
 

 
    this.generatedMessage = !message; 
 
    this.name = 'AssertionError [ERR_ASSERTION]'; 
 
    this.code = 'ERR_ASSERTION'; 
 
    this.actual = actual; 
 
    this.expected = expected; 
 
    this.operator = operator; 
 
    Error.captureStackTrace(this, stackStartFunction); 
 
    } 
 
}

Si je vous , Je ne redéfinirais pas AssertionError, c'est très, très hacky. Je pense que votre meilleur pari est d'étendre cette classe à MyAssertionError ou de créer une erreur twin than extends.

Espérons que ça aide!

+0

Hmm ... Je prends du 'lib/interne 'Dans le chemin qu'il n'est pas destiné à la consommation publique. Zut. –

+0

En ce qui concerne mon extrait ci-dessus, je ne redéfinis pas 'AssertionError', juste en y faisant référence. Je ne suis pas sûr de ce que vous entendez par "étendre cette classe à MyAssertionError". J'utilise la bibliothèque 'assert' intégrée de Node, donc je ne peux pas lui dire quelle classe d'erreur utiliser, elle utilisera toujours' AssertionError'. –

+0

@TurnerHayes - est-ce que ma réponse précédente est ce que vous cherchez? – fider

0

classe d'erreur Assertion est définie ici:

assert.AssertionError 

* Il peut être utile lors des tests et AsserionError est résultat escompté:

assert.throws(FunctionThatShouldThrow_AssertionError, assert.AssertionError)