3

是否可以从 JavaScript 中的调用者函数返回/退出?

我们正在向我们的框架添加测试方法,如果我们在断言上出现错误,我们希望退出。

鉴于以下简单的示例代码,我想将 EXIT_TEST_THAT_CALLED_ME 交换为将退出(相当于在测试中返回)方法 Test123 的东西。

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  

}

我尝试过的
返回- 当然不起作用,因为它只从断言方法返回
arguments.callee.caller.return - 什么都不做
arguments.callee.caller.return() - 没有方法'return'

注意
更改为已经具有此功能且一切都很好的测试框架不是一种选择。:(

4

3 回答 3

2

一种选择是使用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 回答