2013-02-03 2 views
26

ich Jasmin bin neu und übernahm die .not.toBeDefined() oder .toBeUndefined() Streichhölzern Sie könnten überprüfen, ob eine Variable undefined ist:Jasmin 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 
    }); 

}); 

ich völlig, dass diese innerhalb des Codes fehlschlagen würde, aber ich nahm mit diese Streichhölzer, würde es nicht. Verwende ich nur diese falsch, oder ist es nicht möglich, eine Spezifikation zu schreiben, um zu überprüfen, ob etwas undefined ist?

+0

Dieser Fehler wird durch die Ecmasceipt-Engine verursacht, die von Natur aus ausgelöst wird, da Sie auf eine nicht definierte Variable zugreifen. Dies wird völlig erwartet, da es nicht Jasmins Schuld ist. So verhält sich die Sprache. – Reece

Antwort

36

Das Problem ist, dass

expect(obj).toBeUndefined(); 

ausfällt, bevor der Anruf selbst zu Jasmine passiert. Es ist falsch, auf eine Variable zu verweisen, die nicht definiert ist (in neuen Browsern oder zumindest im "strikten" Modus). Statt

dieses Setup Versuchen:

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

In diesem Code gibt es eine Variable "obj", dessen Wert ein leeres Objekt. Es ist in JavaScript in Ordnung, auf eine nicht vorhandene Eigenschaft eines Objekts zu verweisen, und da eine solche Referenz in undefined resultiert, wird der Test bestanden. Eine andere Möglichkeit wäre:

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

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

Rechts. Danke für die Einsicht. :) –

+17

Sie könnten auch tun: 'expect (typeof obj) .toBe ('undefined')' –

+0

Danke, jetzt kann ich das funktionieren: beschreiben ("A girl", function() { es ("hat keinen Namen . ", function() { expect ({} .arya) .toBeUndefined(); }) }); – Seanonymous

4

Beachten Sie, dass Ihr Fehler besagt, dass obj is not defined.

Es heißt nicht, dass obj ist undefined.

undefined ist eigentlich ein Datentyp in Javascript.

Jede deklarierte Variable ohne Zuweisung hat standardmäßig den Wert undefined, aber diese Variable muss deklariert werden.

Also wenn Jasmine testet, ob ein Wert undefined ist, wird festgestellt, ob obj === undefined.

Wenn Sie

var obj; 

erklären, dann wird obj als undefiniert testen.

Wenn Sie obj nicht deklarieren, dann gibt es für den Jasmine-Matcher keinen Vergleich mit dem Datentyp undefined.