web-dev-qa-db-fra.com

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

Que signifie assert en JavaScript?

J'ai vu quelque chose comme:

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

Et voudrait savoir ce que la méthode assert() fait.

242
frrlod

Il n'y a pas assert en JavaScript (pour le moment, il y a on parle d'en ajouter un , mais c'est à un stade précoce). Vous utilisez peut-être une bibliothèque qui en fournit une. Le sens habituel est de générer une erreur si l'expression transmise à la fonction est fausse; cela fait partie du concept général de vérification d'assertions . Habituellement, les assertions (comme on les appelle) ne sont utilisées que dans des versions "de test" ou "de débogage" et dépouillées du code de production.

Supposons que vous ayez une fonction supposée toujours accepter une chaîne. Vous voudriez savoir si quelqu'un a appelé cette fonction avec quelque chose qui n'était pas une chaîne. Alors vous pourriez faire:

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

... où assert renverrait 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'objet Error si le moteur JavaScript le prend en charge (mais pas vraiment les anciens), ce qui présente l'avantage de collecter une trace de pile et autres:

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}

Même IE8 a Error (bien qu'il n'ait pas la propriété stack, mais les moteurs modernes [y compris IE moderne] le sont].

339
T.J. Crowder

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

Pour plus d'informations:

147
joaoprib

Les autres réponses sont bonnes: il n’existe pas de fonction d’affirmation intégrée dans ECMAScript5 (par exemple, un JavaScript qui fonctionne pratiquement partout), mais certains navigateurs vous la fournissent ou proposent des modules complémentaires fournissant cette fonctionnalité. Bien qu'il soit probablement préférable d'utiliser une bibliothèque bien établie/populaire/entretenue à cette fin, une fonction "d'affirmation du pauvre" pourrait ressembler à quelque chose de ce genre:

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
25
iX3

assert() n'est pas une fonction javascript native. C'est une fonction personnalisée créée par quelqu'un. Vous devrez le rechercher sur votre page ou dans vos fichiers et le poster pour que n'importe qui puisse l'aider à déterminer ce qu'il fait. 

8
Crayon Violent

vérifier ceci: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

c'est pour tester JavaScript. Étonnamment, à peine cinq ou six lignes, ce code fournit un niveau élevé 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 brève description de votre test.

La fonction assert crée alors simplement un élément de liste, applique une classe de type «réussite» ou «échec», selon que votre test renvoie ou non la valeur true ou vrai, puis ajoute la description à l'élément de liste. Enfin, ce bloc de code est ajouté à la page. C’est simple, mais ça fonctionne parfaitement.

5
Amrendra

Voici une implémentation très simple d'une fonction assert. Il faut une valeur et une description de ce que vous testez. 

 function assert(value, description) {
        var result = value ? "pass" : "fail";
        console.log(result + ' - ' +  description); 
    };

Si la valeur est évaluée à true, cela passe.

assert (1===1, 'testing if 1=1');  

Si elle retourne false, elle échoue. 

assert (1===2, 'testing if 1=1');
4
joshpierro

Si l'assertion est fausse, le message est affiché. Plus précisément, si le premier argument est faux, le deuxième argument (le message de chaîne) sera enregistré dans la console des outils de développement. Si le premier argument est vrai, fondamentalement rien ne se passe. Un exemple simple: j'utilise les outils de développement de Google: 

var isTrue = true;
var isFalse = false;
console.assert(isTrue, 'Equals true so will NOT log to the console.');
console.assert(isFalse, 'Equals false so WILL log to the console.');
4
Crazy Cat

Il est probablement venu avec une bibliothèque de tests que certains de vos codes utilisent. En voici un exemple (il est probable que ce n'est pas la même bibliothèque que votre code utilise, mais cela montre l'idée générale):

http://chaijs.com/guide/styles/#assert

3
Matt Browne

En plus d’autres options telles que console.assert ou vous lancez votre propre , vous pouvez utiliser invariant . Il a quelques caractéristiques uniques:

  • Il prend en charge les messages d'erreur formatés (à l'aide d'un spécificateur %s).
  • Dans les environnements de production (tels que définis par l'environnement Node.js ou Webpack), le message d'erreur est facultatif et permet d'obtenir un fichier .js (légèrement) plus petit.
1
Josh Kelley

Les réponses précédentes peuvent être améliorées en termes de performances et de compatibilité.

Vérifiez une fois si l'objet Error existe, sinon déclarez-le:

if (typeof Error === "undefined") {
    Error = function(message) {
        this.message = message;
    };
    Error.prototype.message = "";
}

Ensuite, chaque assertion vérifiera la condition et toujours jettera un objet Error

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

N'oubliez pas que la console n'affichera pas le numéro de ligne d'erreur réel, mais la ligne de la fonction assert, ce qui n'est pas utile pour le débogage.

1
Karl.S

Si vous utilisez webpack, vous pouvez simplement utiliser la bibliothèque d'assertion node.js . Bien qu'ils prétendent qu'il ne s'agit «pas d'une bibliothèque d'assertions à usage général», cela semble plus que correct pour les assertions ad hoc et il semble qu'aucun concurrent n'existe de toute façon dans l'espace des nœuds (Chai est conçu pour les tests unitaires).

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

Vous devez utiliser webpack ou browserify pour pouvoir l'utiliser. Évidemment, cela n'est utile que si cela se trouve déjà dans votre flux de travail.

1
amoe

Comme mentionné par T.J., il n'y a pas assert dans JavaScript . Cependant, il existe un module de nœud nommé assert , qui est utilisé principalement pour tester . alors, vous pourriez voir un code comme:

const assert = require('assert');
assert(5 > 7);
0
yuval.bl