3

JavaScript の呼び出し元関数から戻る/終了することは可能ですか?

フレームワークにテスト メソッドを追加していて、アサーションでエラーが発生した場合は終了したいと考えています。

次の簡単なコード例を考えると、私は EXIT_TEST_THAT_CALLED_ME を、Test123 メソッドを終了する (テストで return を実行するのと同じ) 何かに交換したいと考えています。

Assert = function ( expectedTrue, comment ) {
    if( ! expectedTrue ) {
      Log.Error( comment );
      EXIT_TEST_THAT_CALLED_ME;    
    }
}

Test123 ( ... ) {

  var inputField = getInputField(".input");
  Assert( (inputField !== null ), "Checking that we found an input field");

  inputField.doSomething();
  // This row will cause run time error if inputField is null  

}

私が試したもの
return - もちろん、メソッドのアサートからのみ返されるため、機能
ません。

注:
既にこれがあり、すべてが適切なテスト フレームワークに変更することはオプションではありません。:(

4

3 に答える 3

2

1つのオプションは、使用することですtry\catch\throw

Assert = function ( expectedTrue, comment ) {
    if( ! expectedTrue ) {
      Log.Error( comment );
      throw "OOPS";
    }
}

try{
  // function that users Assert
  Test123 ( ... )
}

catch(err){       
    alert(err);
    if (err=="OOPS"){
    //special handling for a certain exception
    }
}

このフローを使用すると、例外がスローされた瞬間に、例外を処理するための catch ブロックに到達するまで上方に伝播します。

また、例外は文字列に限定されません。整数、ブール値、またはオブジェクトにすることができます。

于 2013-03-28T10:07:46.467 に答える
2

呼び出し元の実行フローを変更することはできません。これは仕様によるものです。

あなたができることは次のとおりです。

  • 例外をスローします。どこかでキャッチされるまで泡立ち、すぐに呼び出し元を終了します。
  • テスト関数を変更して、 のような条件付きリターンを作成しますif (!assert(…)) return;
于 2013-03-28T10:15:05.207 に答える
1

関数から呼び出し元を終了することはできないと思います。いくつかの回避策をお勧めします:

1.あなたの値を返し、呼び出し元でAssert行うreturn

Assert = function ( expectedTrue, comment ) {
            if( ! expectedTrue ) {
              Log.Error( comment );
              return false;    
            }
            return true;
        }    
Test123 ( ... ) {
        var assertResult = Assert( (inputField !== null ), "Checking that we found an input field");
        if (!assertResult)
            return;
        inputField.doSomething();
    }

2. にコールバック関数を送信しますAssert

Assert = function ( expectedTrue, comment, success) {
            if( ! expectedTrue ) {
              Log.Error( comment );
              return;    
            }
            success();
         } 
assertSuccess = function () {
   inputField.doSomething();
}
Test123 ( ... ) {
    Assert( (inputField !== null ), "Checking that we found an input field", assertSuccess);
}
于 2013-03-28T10:05:51.373 に答える