2013-03-09 10 views
218

Che cosa significa assert in JavaScript?Che cos'è "assert" in JavaScript?

Ho visto qualcosa di simile:

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

E vorrei sapere ciò che il metodo assert() fa.

risposta

302

Non c'è assert in JavaScript (ancora, c'è talk of adding one, ma è in una fase iniziale). Forse stai usando una libreria che ne fornisce una. Il significato normale è quello di lanciare un errore se l'espressione passata nella funzione è falsa; questo fa parte del concetto generale di assertion checking. Solitamente le asserzioni (come vengono chiamate) vengono utilizzate solo nelle build "testing" o "debug" e vengono eliminate dal codice di produzione.

Supponiamo di avere una funzione che doveva essere sempre accettare una stringa. Vorresti sapere se qualcuno ha chiamato quella funzione con qualcosa che non era una stringa. Così si potrebbe fare:

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

... dove assert getterebbe un errore se la condizione fosse falsa.

Una versione molto semplice sarebbe simile a questa:

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

Meglio ancora, utilizzare l'oggetto Error se il motore JavaScript supporta (quelli veramente vecchi non potrebbe), che ha il vantaggio di raccogliere un stack trace e tale:

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

Anche IE8 ha Error (anche se non ha la proprietà stack, ma i motori moderni, tra cui [IE moderna] fare).

+6

... ottenere informazioni sui tipi in JS? Direi che è uno dei peggiori motivi per "affermare". – cHao

+100

@cHao: esistono casi d'uso validi. Era solo il primo esempio che mi è venuto in mente. L'esempio non è il punto. Il concetto di asserzioni è il punto. –

+3

qualcosa che ho aggiunto al mio codice all'interno di 'if (! Condition)' sta impostando 'var throwError = true;' then 'debugger;' quindi avvolge la sezione throw in un 'if (throwError)'. In questo modo, se ho il debugger aperto, si romperà e, se lo desidero, potrò impostare "throwError' su false e quindi esaminare tutti gli ambiti durante l'uscita. – Rick

8

assert() non è una funzione javascript nativa. È una funzione personalizzata fatta da qualcuno. Dovrai cercarlo sulla tua pagina o nei tuoi file e pubblicarlo per chiunque sia in grado di determinare cosa sta facendo.

2

Probabilmente è venuto con una libreria di test che sta usando parte del codice. Ecco un esempio di uno (è probabile che non è la stessa libreria il tuo codice sta usando, ma mostra l'idea generale):

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

5

controllo questo: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

è per testare JavaScript. Sorprendentemente, a sole cinque o sei righe, questo codice fornisce un grande livello di potenza e controllo sul codice, durante i test.

La funzione assert accetta due parametri:

risultato: un valore booleano, che fa riferimento se il test è stato superato o fallito

Descrizione: Una breve descrizione della vostra prova.

La funzione assert poi semplicemente crea una voce di elenco, si applica una classe di entrambi i “pass” o “fail”, dipende dal fatto che il test restituito vero o falso, e quindi aggiunge la descrizione per la voce di elenco. Infine, quel blocco di codice viene aggiunto alla pagina. È pazzesco semplice, ma funziona perfettamente.

133

Se si utilizza un browser moderno o un nodojs, è possibile utilizzare console.assert(expression, object).

Per maggiori informazioni:

+1

C'è anche il modulo assert, documentato su http://nodejs.org/api/assert.html –

+31

FYI, questo agisce più come 'console.error' in quanto il codice continua a eseguire. –

+6

@DanielSokolowski, esattamente. 'console.assert' non è così buono a meno che non abbia lo stesso comportamento di' throw'. – Pacerier

19

Le altre risposte sono buone: non esiste una funzione di asserzione incorporata in ECMAScript5 (ad es. JavaScript che funziona praticamente ovunque) ma alcuni browser glielo danno o hanno add-on che forniscono quella funzionalità. Mentre è probabilmente meglio utilizzare un/popolare libreria consolidata/mantenuto per questo, per scopi accademici una funzione "assert poveri" potrebbe essere simile a questo:

var assert = function(condition, message) { 
    if (!condition) 
     throw Error("Assert failed" + (typeof message !== "undefined" ? ": " + message : "")); 
}; 

assert(1===1); // executes without problem 
assert(false, "Expected true"); // yields "Error: Assert failed: Expected true" in console 
+0

Vedere http://stackoverflow.com/questions/15313418/javascript-assert#comment48915308_17054137 – Pacerier

1

risposte precedenti possono essere migliorati in termini di prestazioni e compatibilità.

check volta se l'oggetto esiste Error, se non dichiararla:

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

Poi, ogni asserzione controllerà la condizione, e sempre gettare un Error oggetto

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

Ricordare che la console non visualizzerà il numero della riga di errore reale, ma la linea dello assert, che non è utile per il debug.

4

Ecco una implementazione molto semplice di una funzione di asserzione. Ci vuole un valore e una descrizione di ciò che stai testando.

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

Se il valore restituisce true, passa.

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

Se restituisce false, non riesce.

assert (1===2, 'testing if 1=1'); 
+0

Lo scopo di un'asserzione non è quello di accedere allo stdout a livello di informazioni, ma di interrompere l'esecuzione del programma (di solito sollevando un'eccezione) e di accedere a stderr se l'asserzione viene valutata su false. –

4

Se l'asserzione è falsa, viene visualizzato il messaggio. In particolare, se il primo argomento è falso, il secondo argomento (il messaggio stringa) verrà registrato nella console degli strumenti per sviluppatori. Se il primo argomento è vero, in pratica non succede nulla. Un semplice esempio - Sto utilizzando 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.'); 
1

Se si utilizza webpack, si può semplicemente utilizzare il node.js assertion library. Sebbene affermino che "non intenda essere una biblioteca di asserzioni di uso generale", sembra essere più che OK per asserzioni ad hoc, e sembra che nessun concorrente esista comunque nello spazio del Nodo (Chai è progettato per il test delle unità).

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

è necessario utilizzare webpack o browserify per essere in grado di utilizzare questo, quindi ovviamente questo è utile solo se questi sono già nel flusso di lavoro.

1

Oltre alle altre opzioni come console.assert o rolling your own, è possibile utilizzare invariant. Ha un paio di caratteristiche uniche:

  • Supporta messaggi di errore formattati (utilizzando un identificatore %s).
  • In ambienti di produzione (come determinato dall'ambiente Node.js o Webpack), il messaggio di errore è facoltativo, consentendo (.) Un minore .js.