2013-02-03 18 views
26

Sono nuovo di Jasmine e assunto con i .not.toBeDefined() o .toBeUndefined() partite potreste controllare se una variabile è undefined:Jasmine toBeUndefined

describe('toBeDefined', function() { 

    it('should be defined', function() { 
     var obj = {}; 
     expect(obj).toBeDefined(); // Passes 
    }); 

    it('should not be defined using .not.tobeDefined()', function() { 
     //var obj = {}; 
     expect(obj).not.toBeDefined(); // Fails // ReferenceError: obj is not defined 
    }); 

    it('should not be defined using .tobeUnefined()', function() { 
     //var obj = {}; 
     expect(obj).toBeUndefined(); // Fails // ReferenceError: obj is not defined 
    }); 

}); 

ho completamente capito che questo sarebbe fallire all'interno del codice, ma ho assunto con quelle partite, non sarebbe. Sto solo usando questi errori, o non è possibile scrivere una specifica per verificare se qualcosa è undefined?

+0

Questo errore è determinato dal motore ecmasceipt che, per sua natura, genera poiché si accede a una variabile non definita. Questo è assolutamente previsto in quanto non è colpa di Jasmine. È il modo in cui si comporta la lingua. – Reece

risposta

36

Il problema è che

expect(obj).toBeUndefined(); 

fallisce prima della chiamata a gelsomino accade anche. È errato fare riferimento a una variabile che non è definita (nei nuovi browser o in modalità "strict" almeno).

Prova questa configurazione invece:

it('should not be defined using .tobeUnefined()', function() { 
    var obj = {}; 
    expect(obj.not_defined).toBeUndefined(); 
}); 

In quel codice, c'è una variabile "obj" il cui valore è un oggetto vuoto. Va bene in JavaScript fare riferimento a una proprietà inesistente di un oggetto e, poiché tale riferimento risulta in undefined, il test passerà. Un altro modo per farlo sarebbe:

it('should not be defined using .tobeUnefined()', function() { 
    var no_value; 

    expect(no_value).toBeUndefined(); 
}); 
+0

Giusto. Grazie per l'intuizione. :) –

+17

Si potrebbe anche fare: 'expect (typeof obj) .toBe ('undefined')' –

+0

Grazie, ora posso farlo funzionare: descrivere ("A girl", function() { it ("non ha nome . ", function() { expect ({}. arya) .toBeUndefined(); }) }); – Seanonymous

4

Si noti che l'errore dice che obj is not defined.

Non dice che obj è non definito.

undefined è in realtà un tipo di dati in Javascript.

Qualsiasi variabile dichiarata senza assegnazione viene assegnata un valore di indefinito per impostazione predefinita, ma tale variabile deve essere dichiarata.

Così, quando Jasmine Verifica se un valore è definito , si sta determinando se obj === undefined.

Se si dichiara

var obj; 

poi obj metterà alla prova come indefinito.

Se non si dichiara obj, allora non c'è nulla per il matcher Jasmine da confrontare con il tipo di dati di indefinita.