283 votes

Qu'est-ce que "assert" en JavaScript ?

Qu'est-ce que assert signifie en JavaScript ?

J'ai vu quelque chose comme :

assert(function1() && function2() && function3(), "some text");

Et j'aimerais savoir quelle est la méthode assert() fait.

403voto

T.J. Crowder Points 285826

Il n'y a pas de norme assert dans JavaScript lui-même. Vous utilisez peut-être une bibliothèque qui en fournit une ; par exemple, si vous utilisez Node.js, vous utilisez peut-être la bibliothèque module d'assertion . (Les navigateurs et les autres environnements qui offrent une console mettant en œuvre l'option API de la console fournir console.assert .)

La signification habituelle d'un assert est de lancer une erreur si l'expression passée dans la fonction est fausse ; cela fait partie du concept général de la fonction vérification des assertions . En général, les assertions (comme on les appelle) ne sont utilisées que dans les versions de "test" ou de "débogage" et sont exclues du code de production.

Supposons que vous ayez une fonction qui soit censée toujours accepte une chaîne de caractères. Vous voudriez savoir si quelqu'un a appelé cette fonction avec quelque chose qui n'était pas une chaîne (sans avoir une couche de vérification de type comme TypeScript ou Flow). Vous pourriez donc le faire :

assert(typeof argumentName === "string");

...où assert entraînerait une erreur si la condition était fausse.

Une version très simple ressemblerait à ceci :

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}

Mieux encore, utilisez l'outil Error qui a l'avantage de collecter une trace de la pile et autres :

function assert(condition, message) {
    if (!condition) {
        throw new Error(message || "Assertion failed");
    }
}

6 votes

...qui s'insurge contre les types en JS ? Je dirais que c'est l'une des pires raisons de... assert .

154 votes

@cHao : Il y a des cas d'utilisation valables. C'est juste le premier exemple qui m'est venu à l'esprit. L'exemple n'est pas la question. C'est le concept d'assertions qui est important.

5 votes

Quelque chose que j'ai ajouté à mon code à l'intérieur du if(!condition) est en train d'établir var throwError=true; puis debugger; puis envelopper la section "throw" dans un if(throwError) . De cette façon, si j'ai le débogueur ouvert, il se cassera, et si je le souhaite, je peux mettre throwError à false et ensuite examiner tous les scopes en sortant.

163voto

joaoprib Points 593

Si vous utilisez un navigateur moderne ou nodejs, vous pouvez utiliser console.assert(expression, object) .

Pour plus d'informations :

50 votes

Pour info, cela ressemble plus à console.error dans la mesure où le code continue à s'exécuter.

10 votes

@DanielSokolowski, Exactement. console.assert n'est pas si bon que cela, à moins qu'il ait le même comportement que throw .

25 votes

La raison pour laquelle l'exécution continue après console.assert c'est parce que les assertions ne sont pas des fonctions de gestion des erreurs. Elles sont conçues pour vérifier la correction du code pendant le développement uniquement. Traditionnellement, elles sont complètement désactivées dans les environnements de production afin d'éviter que les systèmes actifs ne s'arrêtent à cause d'une erreur banale. Le navigateur est considéré comme un environnement de production. console.assert ne termine pas l'exécution à cet endroit. Si vous comptez sur les assertions pour arrêter l'exécution, vous devriez plutôt utiliser un traitement d'erreur approprié, car les assertions ne sont pas faites pour cela.

30voto

iX3 Points 1506

Les autres réponses sont bonnes : il n'y a pas de fonction assert intégrée à ECMAScript5 (c'est-à-dire un JavaScript qui fonctionne pratiquement partout) mais certains navigateurs vous la donnent ou ont des modules complémentaires qui fournissent cette fonctionnalité. Bien qu'il soit probablement préférable d'utiliser une bibliothèque bien établie / populaire / maintenue pour cela, à des fins académiques, une fonction "assert du pauvre" pourrait ressembler à quelque chose comme ceci :

const assert = function(condition, message) {
    if (!condition)
        throw Error('Assert failed: ' + (message || ''));
};

assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in console

0 votes

0 votes

Par ailleurs, on pourrait facilement modifier ce code de façon à ce qu'il ne génère une erreur que dans les environnements de développement (par exemple, en ajoutant un autre if ou une autre condition) et qu'il ne fasse rien ou n'affiche qu'un avertissement. Personnellement, je pense que les assertions ne devraient être utilisées que dans le code de test (par exemple, pour vérifier si les résultats attendus et réels correspondent) ; dans le code de production, elles devraient être soit superflues (garanties correctes par conception) et donc supprimées, soit uniquement pour protéger les entrées utilisateur/externes, auquel cas elles peuvent être remplacées par une logique d'assainissement et un traitement standard des exceptions (par exemple, les assertions de type "sanitizing"). try , catch , throw )

9voto

Crayon Violent Points 16544

assert() n'est pas une fonction native de javascript. C'est une fonction personnalisée que quelqu'un a créée. Vous devrez la chercher sur votre page ou dans vos fichiers et la poster pour que quiconque puisse déterminer ce qu'elle fait.

6voto

Amrendra Points 1114

Vérifiez ça : http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

c'est pour tester JavaScript. Étonnamment, avec à peine cinq ou six lignes, ce code offre un grand niveau de puissance et de contrôle sur votre code, lors des tests.

La fonction assert accepte deux paramètres :

résultat : Un booléen, qui indique si votre test a réussi ou échoué.

description : Une courte description de votre test.

La fonction assert crée alors simplement un élément de liste, applique une classe "pass" ou "fail", selon que le test renvoie vrai ou faux, puis ajoute la description à l'élément de liste. Enfin, ce bloc de code est ajouté à la page. C'est incroyablement simple, mais cela fonctionne parfaitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X