2012-04-17 3 views
9

Sono nuovo di Qunit e test di unità.Asserire che una funzione genera eccezioni con Qunit

Sto cercando di capire cosa e come testare la seguente funzione. Essa non fa molto al momento, ma ho voluto affermare che se lo passo valori errati che gli errori vengono gettati:

function attrToggle (panel, attr) { 
    'use strict'; 

    if (!panel) { throw new Error('Panel is not defined'); } 
    if (!attr) { throw new Error('Attr is not defined'); } 
    if (typeof panel !== 'string') { throw new Error('Panel is not a string'); } 
    if (typeof attr !== 'string') { throw new Error('Attr is not a string'); } 
    if (arguments.length !== 2) { throw new Error('There should be only two arguments passed to this function')} 

}; 

Come posso fare per affermare che un errore verrà generata se una delle seguenti condizioni non sono soddisfatti?

Ho provato a guardare l'asserzione dei "rilanci" di Qunit, ma penso di non fraintenderlo. La mia interpretazione sarebbe che il test passi se viene generato un errore.

Quindi, se ho provato qualcosa di simile:

test("a test", function() { 
    raises(function() { 
     throw attrToggle([], []); 
    }, attrToggle, "must throw error to pass"); 
}); 

Il test deve passare perché gli errori sono gettati.

risposta

15

Un paio di cose sbagliate, un esempio di lavoro è a http://jsfiddle.net/Z8QxA/1/

Il problema principale è che si sta passando la cosa sbagliata come secondo argomento a raises(). Lo second argument viene utilizzato per verificare che sia stato generato l'errore corretto, quindi si aspetta una regex, un costruttore del tipo di errore o una richiamata che consente di effettuare la propria verifica.

Quindi nel tuo esempio, stai passando attrToggle come il tipo di errore che verrebbe generato. Il tuo codice in realtà genera un tipo Error e quindi il controllo è effettivamente fallito. Passando Error come secondo argomento funziona come si desidera:

test("a test", function() { 
    raises(function() { 
     attrToggle([], []); 
    }, Error, "Must throw error to pass."); 
}); 

In secondo luogo, non occorre la parola throw quando si chiama attrToggle() all'interno raises().

1

sì, avete praticamente capito bene. raises() si aspetta un errore generato quando si verifica un codice.

In genere utilizzo le funzioni try-catch per rilevare i tipi di argomenti errati. Io uso raises() per testare il throw. Se ho inserito un valore errato come argomento e il test non è conforme a raises(), non è stato rilevato alcunché.