如何在YUI3中使用Assert.isUndefined()和Assert.isNotUndefined()?

时间:2011-01-09 03:11:05

标签: javascript tdd yui3

我正在尝试使用YUI3 Test框架测试声明的已定义函数的存在。在Safari和FireFox中,尝试使用isNotUndefined,isUndefined或isFunction失败。我希望那些抛出可以由测试框架处理的异常。

 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

2 个答案:

答案 0 :(得分:2)

好的,昨天有点晚了我猜你现在明白了问题,你想要做的是检查一个变量是否已定义,对吗?

执行此操作的唯一方法是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

答案 1 :(得分:0)

背景:我希望能够区分:

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

因此,这里的挑战是JavaScript不容易区分前2个案例,我希望能够为教学目的做。经过大量的阅读和阅读后,似乎确实有办法实现,至少在网络浏览器和全局变量的背景下(不是很大的限制,但......):

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