Question

Je suis en train de tester la présence d'une déclaration, la fonction définie en utilisant le cadre de test YUI3. Dans Safari et FireFox, en essayant d'utiliser isNotUndefined, isUndefined ou isFunction échoue. Je pense à ceux qui jettent une exception qui peut être gérée par le framework de test.

 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

Mais, au contraire, je ne peux jamais voir les messages d'échec, et le reste des essais ne fonctionne, en raison de l'interprète de prendre le chemin ... ne pas porter atteinte à l'objectif de ces fonctions ou am Je malentendu le cadre?

Mon intuition me dit que, étant donné le code ci-dessus et seul le code ci-dessus,

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

devrait se poursuivre sans une erreur (parce que x est non déclaré) et

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

devrait enregistrer le message "message d'échec" (parce que x est non).

Cependant, en raison de la ReferenceError, il n'y a aucun moyen (en utilisant ces méthodes YUI3) pour tester des objets non déclarés. Au lieu de cela, je suis parti avec un code d'assertion assez laid. Je ne peux pas utiliser

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

ou

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

Ce qui me laisse avec

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

qui est beaucoup moins lisible que

 Y.Assert.isNotUndefined(x)

Encore une fois, je demande: Est-ce pas le but de porter atteinte à ces fonctions, ou je comprends mal le cadre?

 x

est non déclaré, et donc pas directement testables, tandis que

 var x;

déclare, mais laisse non défini. Enfin

 var x = function() {};

est à la fois déclaré et défini.

Je pense que ce qui manque pour moi est la capacité de dire facilement

 Y.Assert.isNotUndeclared(x);

-Wil

Était-ce utile?

La solution 2

CONTEXTE: Je veux être en mesure de faire la distinction entre:

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

Alors, le défi est que JavaScript ne distingue pas facilement entre les 2 premiers cas, que je voulais être en mesure de le faire à des fins d'enseignement. Après beaucoup de jeu et de la lecture, il ne semble y avoir un moyen de le faire, au moins dans le contexte d'un navigateur Web et pour les variables globales (pas de grandes restrictions, mais ...):

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

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

Je me rends compte que l'utilisation de eval pourrait être dangereux, mais le contexte étroitement contrôlé dans lequel j'utiliser ces fonctions, il est OK. Tous les autres, méfiez-vous et voir 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

Autres conseils

OK, était un peu en retard hier pense que je comprends maintenant vous la question, ce que vous voulez faire est de vérifier si une variable a été définie à tout droit?

La seule façon de le faire est typeof x === 'undefined'.

L'opérateur typeof permet des variables non existantes à utiliser avec.

Ainsi, afin de le faire fonctionner, vous devez l'expression ci-dessus et la fiche dans une assert true/false normale.

Par exemple (n'ont pas utilisé YUI3):

Y.Assert.isTrue(typeof x === 'undefined', "fail message"); // isUndefined
Y.Assert.isFalse(typeof x === 'undefined', "fail message"); // isNotUndefined
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top