2013-02-03 11 views
26

Jestem nowy Jasmine i założyć używając .not.toBeDefined() lub .toBeUndefined() mecze można sprawdzić, czy zmienna jest 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 
    }); 

}); 

ja całkowicie się, że to nie w kodzie, ale zakłada się za pomocą te mecze, nie byłoby. Czy używam ich po prostu niewłaściwie, czy też nie jest możliwe napisanie specyfikacji, aby sprawdzić, czy coś jest undefined?

+0

Ten błąd jest określony przez silnik ecmasceipt, który z natury rzuca od czasu uzyskania dostępu do niezdefiniowanej zmiennej. Jest to całkowicie oczekiwane, ponieważ nie jest to wina Jasmine. Tak zachowuje się język. – Reece

Odpowiedz

36

Problemem jest to, że

expect(obj).toBeUndefined(); 

nie przed wywołanie Jasmine nawet zdarza. Błędne jest odwoływanie się do zmiennej, która nie jest zdefiniowana (przynajmniej w nowych przeglądarkach lub w trybie "ścisłym").

Spróbuj konfiguracji zamiast:

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

W tym kodzie, jest zmienna „obj”, którego wartość jest pusty obiekt. W języku JavaScript jest w porządku odwoływanie się do nieistniejącej właściwości obiektu, a ponieważ takie odwołanie daje wynik undefined, test przejdzie. Innym sposobem na to byłoby:

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

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

Dobrze. Dzięki za wgląd. :) –

+17

Możesz także zrobić: 'expect (typeof obj) .toBe ('undefined')' –

+0

Dzięki, teraz mogę to uruchomić: opisz ("A girl", function() { it ("nie ma nazwy . ", function() { expect ({}. arya) .toBeNiezdefiniowane(); }) }); – Seanonymous

4

Zauważ, że Twój błąd mówi, że obj is not defined.

Nie oznacza, że ​​obiekt jest niezdefiniowany.

undefined to faktycznie typ danych w Javascript.

Dowolna zadeklarowana zmienna bez przypisania ma domyślnie wartość niezdefiniowana, ale ta zmienna musi zostać zadeklarowana.

Kiedy więc Jasmine sprawdza, czy wartość to niezdefiniowana, określa ona, czy obj === undefined.

Jeśli zadeklarujesz

var obj; 

następnie obj przetestuje jako niezdefiniowane.

Jeśli nie zadeklarujesz obj, to nie ma nic dla Jasmine matcher do porównania z typem danych niezdefiniowanym.