相关疑难解决方法(0)

JavaScript反静音技术表明失败

什么是报告JavaScript中的错误而不是依赖于null的好方法,以及当错误发生且函数无法继续前进时的未定义.我可以想到三种方法:

  1. 没做什么
  2. 抛出一个例外
  3. 断言

这是一个简单的示例场景 - 一个函数,用于记入传入的用户帐户.该函数creditAccount对象的一部分.

这是天真的解决方案.

function credit(amount) {
   this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一个主要问题是无效数据.让我们修复它,并使用返回值来指示操作失败.

function credit(amount) {
    if(!isInt(amount)) {
        return false;
    }
    this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

这是对前一个的改进,但客户端代码必须检查返回值以确保操作成功.对基本上系统中的每个方法执行此操作可能会变得很麻烦.

if(!johnDoe.credit(100)) {
    // do some error handling here
}
Run Code Online (Sandbox Code Playgroud)

第三种方法,类似于第二种方法,是抛出异常.由于我们自己抛出异常,因此可能抛出特定类型的异常而不是普通异常.

function credit(amount) {
    if(!isInt(amount)) {
        throw new InvalidAmountError(amount);
    }
    this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

类似于抛出异常的第四种方法是在代码中使用断言.与上述方法相比的一个缺点是,由于断言是通用的,因此我们失去了抛出自定义异常的能力.尽管通过传递对象来抛出每个断言调用仍然是可能的.

function credit(amount) {
    assert(!isInt(amount), "Amount to credit is not an integer");
    this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

全局assert函数易于编写,使代码更短.

function assert(value, message) {
    if(value …
Run Code Online (Sandbox Code Playgroud)

javascript error-handling defensive-programming assert

10
推荐指数
1
解决办法
1412
查看次数

当你进行单元测试时,断言是多余的吗?

我还没有用它来编写单元测试,我想在一个完整的小工具框架上做这个(使它更安全使用).这样,我肯定会学到更多关于单元测试的知识,而不是我到目前为止学到的东西.

然而,我真的习惯于系统地添加断言,我发现有一个上下文可以确定(在最终版本中被删除).主要是作为函数实现的前提条件,每次我检索必须正确的信息(比如着名示例的C/C++指针有效性).

现在我问:当你进行单元测试时,断言是多余的吗?因为当你测试一些代码的行为时它看起来很冗余; 但同时它与执行环境不同.

我应该两个都做吗?

language-agnostic unit-testing assert

4
推荐指数
1
解决办法
543
查看次数