2015-11-22 15 views
7

Sto cercando di implementare le funzioni per la stampa di un diamante in termini di sviluppo basato su test di apprendimento in javascript.Jasmine genera un errore su expect(). ToThrow invece di identificare l'errore generato

Diamond.prototype.outerSpace = function (current, widest) { 

    var currentValue = this.getIndexOf(current); 
    var widestValue = this.getIndexOf(widest); 

    if (currentValue > widestValue) { 
     throw new Error('Invalid combination of arguments'); 
    } 

    var spaces = widestValue - currentValue; 
    return new Array(spaces + 1).join(' '); 
}; 

Ho problemi nella gestione degli errori. La funzione precedente dovrebbe generare un errore, se currentValue è maggiore di widestValue.

Questo è il mio frammento che rappresenta il test/spec:

it ("should throw an exception, if it is called with D and C", function() { 
    var outerSpace = diamond.outerSpace.bind(diamond, 'D', 'C'); 
    expect(outerSpace).toThrow('Invalid combination of arguments'); 
}); 

ho provato anche con una funzione anonima in aspettarsi (..), ma anche questo non ha funzionato.

Il messaggio della console è: Funzione prevista per lanciare "Inval ..." ma genera Errore: combinazione di argomenti non valida.

Non capisco, cosa dovrei fare con questa informazione.

Modifica: È strano, perché funziona con Jasmine v.1.3, ma non ha funzionato con jasmine v.2.3 cioè con karma, sebbene il codice sia basato su jasmine.

risposta

9

TL; DR

Con Il Gelsomino 2 le matchers semantica cambiato e c'è un nuovo matcher.

Usa toThrowError("<message>") o toThrow(new Error("<message>")))

NTL; TR

Dal Jasmine 2.x c'è un nuovo Matcher toThrowError() e Jasmine di toThrow() è diventato una nuova semantica.

  • toThrow() dovrebbero essere utilizzati per controllare se qualsiasi errore era tiro o per controllare il messaggio di un Error (più concreto: someting che è instanceof Error)
  • toThrowError() dovrebbero essere utilizzati per controllare se una specifica errore è stato generato o se il messaggio dell'errore è uguale all'aspettativa

Internamente toThrow(x) effettua un controllo di uguaglianza dell'errore generato contro x. Se sia l'errore che instanceof Error sono instanceof Error (vale anche per TypeError), Jasmine controlla l'uguaglianza (=== in generale) di entrambi gli attributi message.

La forma toThrowError(x) controlla se il messaggio di errore pari o partite xtoThrowError(t, x) controlla se l'errore è di tipo t (stringa o RegExp)

L'altra forma e il messaggio è uguale o partite x (stringa o RegExp)

Vedere