2011-01-09 51 views
0

我想使用YUI3測試框架來測試聲明的已定義函數的存在。在Safari和FireFox中,嘗試使用isNotUndefined,isUndefined或isFunction失敗。我期望那些拋出一個可以由測試框架處理的異常。如何在YUI3中使用Assert.isUndefined()和Assert.isNotUndefined()?

Y 
Object 
Y.Assert 
Object 
Y.Assert.isNotUndefined(x, "fail message") 
ReferenceError: Can't find variable: x 
Y.Assert.isUndefined(x, "fail message") 
ReferenceError: Can't find variable: x 
Y.Assert.isFunction(x, "fail message") 
ReferenceError: Can't find variable: x 

但是,相反,我從來沒有看到失敗的消息和測試的剩餘部分不運行,因爲在路上...解釋越來越不有損這些目的的函數,還是我誤解了框架?

我的直覺告訴我,鑑於上面的代碼中,只有上面的代碼,

Y.Assert.isUndefined(x, "fail message") 

應繼續沒有錯誤(因爲x是未申報),並

Y.Assert.isNotUndefined(x, "fail message") 

記錄這一消息「失敗消息」(因爲x未聲明)。

但是,由於ReferenceError,沒有辦法(使用這些YUI3方法)來測試未聲明的對象。相反,我留下了一些非常醜陋的斷言代碼。我不能使用

Y.Assert.isNotUndefined(x) 
ReferenceError: Can't find variable: x 

Y.assert(x !== undefined) 
ReferenceError: Can't find variable: x 

這給我留下了

Y.assert(typeof(x) !== "undefined") // the only working option I've found 
Assert Error: Assertion failed. 

Y.Assert.isNotUndefined(x) 

同樣可讀少多了,我問:隱而不宣這不會破壞這些功能的目的,或者說我誤解了框架?

所以

x 

是未申報的,所以不能直接檢驗的,而

var x; 

聲明它,但它留下未定義。最後

var x = function() {}; 

既是聲明和定義。

我覺得缺少了什麼對我來說是很容易說

Y.Assert.isNotUndeclared(x); 

-Wil

+0

顯示代碼,因此ReferenceError中沒有`x`中的變量。 – 2011-01-09 09:58:06

回答

0

背景:我希望能夠之間的區別:

x // undeclared && undefined 
var x; // declared && undefined 
var x = 5; // declared && defined 

所以,這裏的挑戰是,JavaScript不容易區分前兩種情況,我希望能夠爲教學目的做。大量的遊戲和閱讀之後,似乎是一個辦法做到這一點,至少在網絡瀏覽器的背景和全局變量(不是很大的限制,但...):

function isDeclared(objName) { 
    return (window.hasOwnProperty(objName)) ? true : false; 
} 

function isDefined(objName) { 
    return (isDeclared(objName) && ("undefined" !== typeof eval(objName))) ? true : false; 
} 

我意識到eval的使用可能是不安全的,但是對於我將使用這些函數的嚴格控制的上下文來說,它是可以的。所有其他人,請注意並參閱http://www.jslint.com/lint.html

isDeclared("x") // false 
isDefined("x") // false 

var x; 
isDeclared("x") // true 
isDefined("x") // false 

var x = 5; 
isDeclared("x") // true 
isDefined("x") // true 
2

OK,就有點晚了昨天的能力想我理解你現在的問題,你想什麼做的是檢查一個變量是否被定義了,對吧?

要做到這一點的唯一方法是typeof x === 'undefined'

typeof運算符允許使用不存在的變量。

所以爲了它的工作,你需要上面的表達式,並將其插入正常的true/false斷言。

例如(沒用過YUI3):

Y.Assert.isTrue(typeof x === 'undefined', "fail message"); // isUndefined 
Y.Assert.isFalse(typeof x === 'undefined', "fail message"); // isNotUndefined