Как использовать Assert.isUndefined () и Assert.isNotUndefined () в YUI3? - PullRequest
0 голосов
/ 09 января 2011

Я пытаюсь проверить наличие объявленной определенной функции с помощью инфраструктуры тестирования YUI3. В 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)

Снова я спрашиваю: не подрывает ли это назначение этих функций или я неправильно понимаю структуру?

So

 x

не объявлено и поэтому не может быть проверено напрямую, в то время как

 var x;

объявляет это, но оставляет это неопределенным. Наконец

 var x = function() {};

объявлен и определен.

Я думаю, что мне не хватает способности легко сказать

 Y.Assert.isNotUndeclared(x);

-Wil

Ответы [ 2 ]

2 голосов
/ 09 января 2011

ОК, вчера было немного поздно, наверное, теперь я понимаю, что у вас вопрос, что вы хотите сделать, это проверить, была ли переменная вообще определена, верно?

Единственный способ сделать это - typeof x === 'undefined'.

Оператор typeof позволяет использовать с ним несуществующие переменные.

Итак, чтобы оно работало, вам нужно выражение выше и включите его в обычный true/false assert.

Например (не использовал YUI3):

Y.Assert.isTrue(typeof x === 'undefined', "fail message"); // isUndefined
Y.Assert.isFalse(typeof x === 'undefined', "fail message"); // isNotUndefined
0 голосов
/ 02 февраля 2011

КОНТЕКСТ: я хочу иметь возможность различать:

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
...