0

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)

繰り返しますが、私は尋ねます:それはこれらの機能の目的を損なうのではありませんか、それとも私はフレームワークを誤解していますか?

それで

 x

は宣言されていないため、直接テストすることはできませんが、

 var x;

宣言しますが、未定義のままにします。ついに

 var x = function() {};

宣言され、定義されています。

私に欠けているのは、簡単に言う能力だと思います

 Y.Assert.isNotUndeclared(x);

-ウィル

4

2 に答える 2

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
于 2011-01-09T17:07:47.153 に答える
0

コンテキスト: 次のものを区別できるようにしたい:

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

したがって、ここでの課題は、JavaScript が最初の 2 つのケースを簡単に区別できないことです。これは、教育目的でできるようにしたかったことです。たくさん遊んで読んだ後、少なくともWebブラウザのコンテキスト内で、グローバル変数のためにそれを行う方法があるようです(大きな制限ではありませんが...):

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
于 2011-02-01T22:27:10.053 に答える