2013-02-03 229 views
26

我是新來的茉莉花,並使用.not.toBeDefined().toBeUndefined()的比賽,你可以檢查一個變量是undefined假設:茉莉花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 
    }); 

}); 

我完全搞定,這將在代碼中失敗,但我認爲使用這些比賽,它不會。我只是使用這些錯誤,還是不可能寫一個規範來檢查是否有什麼東西undefined

+0

這個錯誤是由ecmasceipt引擎決定的,該引擎在你訪問一個非定義的變量後自然拋出。這是完全預料不到的,因爲它不是茉莉花的錯。這是語言行爲的方式。 – Reece

回答

36

的問題是,

expect(obj).toBeUndefined(); 

失敗調用茉莉花甚至發生之前。引用未定義的變量是錯誤的(至少在新瀏覽器或「嚴格」模式下)。

試試這個設置改爲:

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

在該代碼中,有一個變量「目標文件」,其值是一個空的對象。在JavaScript中可以引用對象的不存在的屬性,並且由於undefined中的這樣的引用導致測試通過。另一種方式來做到這一點是:

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

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

對。感謝您的洞察力。 :) –

+17

你也可以這樣做:'expect(typeof obj).toBe('undefined')' –

+0

謝謝,現在我可以得到這個工作:describe(「A girl」,function(){「 「),function(){ expect({}。arya).toBeUndefined(); }) }); – Seanonymous

4

需要注意的是你的錯誤說obj is not defined

它並不是說obj是undefined

undefined實際上是Javascript中的數據類型。

默認情況下,任何沒有賦值的聲明變量的賦值爲undefined,但必須聲明該變量。

所以當茉莉花測試一個值是否爲undefined,這是確定是否obj === undefined

如果聲明

var obj; 

然後obj將測試爲未定義。

如果您沒有聲明obj,那麼Jasmine匹配器就不會與的數據類型進行比較。