Was ist "Assert" in JavaScript?

263

Was assertbedeutet in JavaScript?

Ich habe so etwas gesehen wie:

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

Und würde gerne wissen, was die Methode assert()macht.

frrlod
quelle

Antworten:

367

assertIn JavaScript gibt es noch kein (es ist die Rede davon, eines hinzuzufügen , aber es befindet sich in einem frühen Stadium). Vielleicht verwenden Sie eine Bibliothek, die eine bereitstellt. Die übliche Bedeutung ist, einen Fehler auszulösen, wenn der an die Funktion übergebene Ausdruck falsch ist. Dies ist Teil des allgemeinen Konzepts der Assertionsprüfung . Normalerweise werden Zusicherungen (wie sie genannt werden) nur beim "Testen" oder "Debuggen" von Builds verwendet und aus dem Produktionscode entfernt.

Angenommen, Sie hatten eine Funktion, die immer eine Zeichenfolge akzeptieren sollte. Sie möchten wissen, ob jemand diese Funktion mit etwas aufgerufen hat, das keine Zeichenfolge war. So könnten Sie tun:

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

... wo assertwürde ein Fehler auslösen, wenn die Bedingung falsch wäre.

Eine sehr einfache Version würde so aussehen:

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

Besser noch, nutzen Sie das ErrorObjekt, wenn die JavaScript-Engine es unterstützt (wirklich alte möglicherweise nicht), was den Vorteil hat, einen Stack-Trace zu sammeln und so weiter:

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

Sogar IE8 hat Error(obwohl es nicht die stackEigenschaft hat, aber moderne Motoren [einschließlich moderner IE] tun).

TJ Crowder
quelle
6
... sich über Typen in JS aufregen? Ich würde behaupten, das ist einer der schlimmsten Gründe dafür assert.
CHao
137
@cHao: Es gibt gültige Anwendungsfälle. Es war nur das erste Beispiel, das mir in den Sinn kam. Das Beispiel ist nicht der Punkt. Das Konzept der Behauptungen ist der Punkt.
TJ Crowder
4
Etwas, das ich meinem Code innerhalb der if(!condition)Einstellung hinzugefügt habe, ist, var throwError=true;dann debugger;den Wurfabschnitt in ein zu verpacken if(throwError). Auf diese Weise wird der Debugger unterbrochen, wenn ich ihn geöffnet habe. Wenn ich dies wünsche, kann ich throwErrorauf false setzen und dann alle Bereiche untersuchen, während ich aussteige.
Rick
8
@Rick Wenn Sie Chrome DevTools verwenden, können Sie einfach "Pause bei nicht erfassten Ausnahmen" auf der Registerkarte "Quellen" aktivieren throw. Auf diese Weise brauchen Sie die debugger;Aussage nicht. Weitere Informationen finden Sie unter developer.chrome.com/devtools/docs/… .
Vicky Chijwani
1
@machineghost: Ich sehe nicht, wie das "einfacher" ist, Sie haben gerade ifgegen einen bedingten Operator getauscht . In der heutigen Welt würde ich mir sowieso nicht die Mühe machen, Motoren zu unterstützen, die keine haben Error.
TJ Crowder
157

Wenn Sie einen modernen Browser oder NodeJS verwenden, können Sie verwenden console.assert(expression, object) .

Für mehr Informationen:

Joaoprib
quelle
46
Zu Ihrer Information, dies verhält sich eher so console.error, als würde der Code weiterhin ausgeführt.
Daniel Sokolowski
10
@ DanielSokolowski, genau. console.assertist nicht so gut, es sei denn, es hat das gleiche Verhalten wie throw.
Pacerier
23
Der Grund, warum die Ausführung danach fortgesetzt wird, console.assertliegt darin, dass Zusicherungen keine Fehlerbehandlungsfunktionen sind. Sie dienen nur zur Überprüfung der Codekorrektheit während der Entwicklung. Traditionell sind sie in Produktionsumgebungen vollständig deaktiviert, um zu vermeiden, dass Live-Systeme aufgrund von Kleinigkeiten beendet werden. Der Browser gilt als Produktionsumgebung und console.assertbeendet die Ausführung dort nicht. Wenn Sie sich auf Assertions verlassen, um die Ausführung zu stoppen, sollten Sie stattdessen die richtige Fehlerbehandlung verwenden, da dies nicht der Zweck von Assertions ist.
Malvineous
8
@ RonBurk: Sprachdesigner haben entschieden, "wofür Behauptungen gedacht sind". In C ++ dient [eine Zusicherung] zum Erfassen von Programmierfehlern, nicht von Benutzer- oder Laufzeitfehlern, da sie im Allgemeinen deaktiviert wird, nachdem ein Programm seine Debugging-Phase beendet hat. PHP sagt Als Faustregel sollte Ihr Code immer korrekt funktionieren können, wenn die Assertionsprüfung nicht aktiviert ist. Die passive Stimme sollte nicht einer persönlichen Präferenz Autorität verleihen, sondern vielmehr über die allgemein anerkannte allgemeine Praxis berichten.
Malvineous
4
@ Don: Punkt genommen, aber ich habe nur von den verlinkten Seiten zitiert. Ich glaube, Behauptungen sollten so behandelt werden, als könnten sie deaktiviert werden, schon allein deshalb, weil Ihr Code eines Tages von jemandem verwendet werden könnte, der dies für sicher hält. Wenn Zusicherungen für Ihren Code kritisch sind, sollten sie meiner Meinung nach auf eine ordnungsgemäße Fehlerprüfung aktualisiert werden, anstatt sich auf eine Debugging-Methode zu verlassen, bei der nicht immer garantiert wird, dass die Ausführung beendet wird. Ganz zu schweigen davon, dass das wiederholte Absterben Ihres Codes in einer Produktionsumgebung, wenn er nur einen Fehler zurückgeben und fortfahren könnte, mehr Stress verursachen kann, als es wert ist!
Malvineous
29

Die anderen Antworten sind gut: In ECMAScript5 ist keine Assert-Funktion integriert (z. B. JavaScript, das im Grunde überall funktioniert), aber einige Browser geben sie Ihnen oder verfügen über Add-Ons, die diese Funktionalität bereitstellen. Während es wahrscheinlich am besten ist, eine gut etablierte / beliebte / gepflegte Bibliothek dafür zu verwenden, könnte für akademische Zwecke eine Funktion "Behauptung eines armen Mannes" ungefähr so ​​aussehen:

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
iX3
quelle
Übrigens könnte man dies leicht so ändern, dass es nur in Entwicklungsumgebungen einen Fehler auslöst (z. B. durch Umschließen einer anderen, wenn / Hinzufügen einer anderen Bedingung) und ansonsten nichts tut oder nur eine Warnung druckt. Persönlich bin ich der Meinung, dass Aussagen nur im Testcode enthalten sein sollten (z. B. Überprüfung, ob erwartete und tatsächliche Ergebnisse übereinstimmen); in Produktionscode sollten sie entweder überflüssig werden (korrekt nach Design garantiert) und somit entfernt oder nur Benutzer / externer Eingang für die Bewachung in welchem Fall sie durch desinfizierende Logik & Standardausnahmebehandlung ersetzt werden kann (zB try, catch, throw)
Ix3
8

assert()ist keine native Javascript-Funktion. Es ist eine benutzerdefinierte Funktion, die jemand gemacht hat. Sie müssen es auf Ihrer Seite oder in Ihren Dateien suchen und für jedermann veröffentlichen, um festzustellen, was es tut.

Wachsmalstift gewalttätig
quelle
5

Überprüfen Sie dies: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

Es dient zum Testen von JavaScript. Erstaunlicherweise bietet dieser Code mit knapp fünf oder sechs Zeilen beim Testen ein hohes Maß an Leistung und Kontrolle über Ihren Code.

Die Assert-Funktion akzeptiert zwei Parameter:

Ergebnis: Ein Boolescher Wert, der angibt, ob Ihr Test bestanden oder nicht bestanden wurde

Beschreibung: Eine kurze Beschreibung Ihres Tests.

Die Assert-Funktion erstellt dann einfach ein Listenelement, wendet eine Klasse von "Bestanden" oder "Nicht Bestanden" an, je nachdem, ob Ihr Test wahr oder falsch zurückgegeben hat, und hängt dann die Beschreibung an das Listenelement an. Schließlich wird dieser codierte Block zur Seite hinzugefügt. Es ist verrückt einfach, funktioniert aber perfekt.

Amrendra
quelle
4

Hier ist eine wirklich einfache Implementierung einer Assert-Funktion. Es braucht einen Wert und eine Beschreibung dessen, was Sie testen.

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

Wenn der Wert true ergibt, wird er übergeben.

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

Wenn es false zurückgibt, schlägt es fehl.

assert (1===2, 'testing if 1=1');
Joshpierro
quelle
1
Der Zweck einer Zusicherung besteht nicht darin, sich auf Info-Ebene bei stdout anzumelden, sondern die Programmausführung zu stoppen (normalerweise eine Ausnahme auszulösen) und bei stderr zu protokollieren, wenn die Zusicherung mit false bewertet wird.
Nuno André
4

Wenn die Behauptung falsch ist, wird die Nachricht angezeigt. Wenn das erste Argument falsch ist, wird das zweite Argument (die Zeichenfolgenmeldung) in der Entwickler-Tools-Konsole protokolliert. Wenn das erste Argument wahr ist, passiert im Grunde nichts. Ein einfaches Beispiel - Ich verwende Google Developer Tools:

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.');
Verrückte Katze
quelle
3

Es wurde wahrscheinlich mit einer Testbibliothek geliefert, die ein Teil Ihres Codes verwendet. Hier ist ein Beispiel von einem (wahrscheinlich ist es nicht dieselbe Bibliothek, die Ihr Code verwendet, aber es zeigt die allgemeine Idee):

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

Matt Browne
quelle
2

Das Wort oder die Funktion "assert" wird hauptsächlich zum Testen von Teilen der Anwendung verwendet.

Assert-Funktionen sind eine kurze Möglichkeit, das Programm anzuweisen, die Bedingung zu überprüfen (auch als "Assertion" bezeichnet). Wenn die Bedingung nicht True ist, wird ein Fehler ausgegeben.

Mal sehen, wie es im "normalen Code" aussehen würde

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

Mit können assertSie einfach schreiben:

assert(typeof "string" === "array")

In Javascript gibt es kein Muttersprachler assert Funktion, daher müssen Sie eine aus einer Bibliothek verwenden.

Zur einfachen Einführung können Sie diesen Artikel lesen:

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

Ich hoffe, es hilft.

Pavel
quelle
2

Assertion löst eine Fehlermeldung aus, wenn das erste Attribut falsch ist, und das zweite Attribut ist die Nachricht, die ausgelöst werden soll.

console.assert(condition,message);

Es gibt viele Kommentare, die besagen, dass Assertion nicht in JavaScript vorhanden ist, sondern console.assert()die Assert-Funktion in JavaScript. Die Idee der Assertion besteht darin, herauszufinden, warum / wo der Fehler auftritt.

console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");

Hier finden Sie je nach Meldung den Fehler. Diese Fehlermeldungen werden der Konsole in roter Farbe angezeigt, als ob wir aufgerufen hätten, console.error();
um weitere Funktionen in der Konsole auszuführenconsole.log(console);

Rahul
quelle
1

Frühere Antworten können hinsichtlich Leistung und Kompatibilität verbessert werden.

Überprüfen Sie einmal, ob das ErrorObjekt vorhanden ist, und deklarieren Sie es, wenn nicht:

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

Dann überprüft jede Behauptung die Bedingung und wirft immer ein ErrorObjekt

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

Beachten Sie, dass die Konsole nicht die tatsächliche Fehlerzeilennummer anzeigt, sondern die Zeile der assertFunktion, die für das Debuggen nicht hilfreich ist.

Karl.S
quelle
1

Wenn Sie das Webpack verwenden, können Sie einfach die Assertionsbibliothek node.js verwenden . Obwohl sie behaupten, dass es "nicht für eine Allzweck-Assertionsbibliothek gedacht ist", scheint es für Ad-hoc-Assertions mehr als in Ordnung zu sein, und es scheint sowieso keinen Konkurrenten im Node-Bereich zu geben (Chai ist für Unit-Tests konzipiert).

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

Sie müssen Webpack oder browserify verwenden, um dies verwenden zu können. Dies ist also offensichtlich nur dann nützlich, wenn sich diese bereits in Ihrem Workflow befinden.

Amöe
quelle
1

Zusätzlich zu anderen Optionen wie console.assert oder Rolling Your Own können Sie invariant verwenden . Es hat ein paar einzigartige Eigenschaften:

  • Es unterstützt formatierte Fehlermeldungen (mit a %s Bezeichners).
  • In Produktionsumgebungen (wie von der Node.js- oder Webpack-Umgebung festgelegt) ist die Fehlermeldung optional und ermöglicht (geringfügig) kleinere .js.
Josh Kelley
quelle
0

Wie von TJ erwähnt, gibt es assertin JavaScript keine . Es gibt jedoch ein Knotenmodul namens assert , das hauptsächlich zum Testen verwendet wird . Möglicherweise sehen Sie Code wie:

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