当前位置:网站首页 > 创业 > 正文

node.js学习之断言assert的使用

0 张子豪 张子豪 2025-10-12 17:51 1

一、断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

使用断言可以创建更稳定、品质更好且 不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。【单元测试】必须使用断言。

Node提供了 10 多个断言测试的函数,用于测试不变式,我在文章中中将这 10 多个函数进行了分组,方便理解记忆。

【提示】在本文章中,expected 代表预期值,actual 代表实际值, message 代表自定义信息

工具/原料

  • JavaScript

方法/步骤

  1. 1

    二、判断值是否为真值

    判断值是否为真值有以下两个断言测试函数

    2.1 assert(value[, message])

    这个测试函数在 【Boolean(value)】 为 【true】时通过断言测试,否则抛出 【AssertionError】

  2. 2

    上面代码中 value 为false,则抛出一个带有 message 属性的 【AssertionError】,其中 message 属性的值等于传入的 message 参数的值。 【如果 message 参数为 undefined,则赋予默认的错误信息】。

  3. 3

    上面代码由于没有指定【message】参数,抛出的为默认错误信息的【AssertionError】

    2.2 assert.ok(value[, message])

    assert.ok() 与 assert()的作用是一样的,都是测试【value】是否为真值。而且用法也一样,所以可以将assert()视为assert.ok()的语法糖

  4. 4

    三、判断预期值和实际值相等(==)

    这一组里面有两个测试函数,用于测试预期值与实际值是否相等,如果相等则断言通过,否则抛出 【AssertionError】

    3.1 assert.equal(actual, expected[, message])

    assert.equal()用于测试期望值和实际值是否相等,【在值类型的时候比较的是两个值是否相等,当预期值和实际值为引用类型的时候,比较的是值得引用】

  5. 5

    3.2 assert.deepEqual(actual, expected[, message])

    同样也是测试 预期值 和 实际值 是否相等,使用的仍然是(==),但是与equal不同的是,【deepEqual()在对引用类型进行比较的时候,不是对值的引用进行比较,而是比较的对象的属性值】

  6. 6

    上面代码是对引用类型的比较,可以看出【deepEqual() 】比较的是属性值,而非引用,这是与equal()不同的地方。

    【注意!!】deepEqual()只测试可枚举的自身属性,不测试对象的原型、连接符、或不可枚举的属性(这些情况使用 assert.deepStrictEqual() ,稍后会总结到)

  7. 7

    上面代码中 ena 和 enb 用于相同的可枚举属性【name】,有着值不同的不可枚举属性【hobby】,说明【deepEqual()不测试对象的不可枚举的属性】

    四. 判断预期值和实际值全等(===)

    这组测试函数是用于判断预期值和实际值是否深度相等的,内部使用的是(===),所以对象的原型也会进行比较,值得类型也是比较的范围。这组也有两个测试函数。

    4.1 assert.deepStrictEqual(actual, expected[, message])

    由于内部使用的是全等(===),所以对象的原型也会计入比较的范围

  8. 8

    上面代码使用了deepEqual()和deepStrictEqual()进行了断言测试,son1 和 son2 分别继承与两个不同的对象,但是拥有相同的属性值。可以看出【deepEqual()是不会考虑对象的原型的,deepStrictEqual()将原型对象列入了比较对象】

    4.2 assert.strictEqual(actual, expected[, message])

    strictEqual()是equal()的加强,考虑了数据类型;如果actual === expected,则断言通过,否则抛出AssertionError,message?message:默认错误信息。

  9. 9

    【提示!!】对引用类型还是永远通不过【strictEqual()】断言测试

    五、判断预期值和实际值不相等(!=)

    上面总结到了判断预期值和实际值相等,这儿总结一下判断预期值和实际值不想等的两个测试函数,实际上就是上面 (三) 的逆运算。

    5.1 assert.notEqual(actual, expected[, message])

    【notEqual()】为 【equal() 】的逆运算,如果 actual!= expected 则断言通过,同样对于值类型是单纯对值进行比较,对应引用类型比较的是值得引用

  10. 10

    上面的代码是对引用类型进行的断言测试,【notEqual() 】对于两个对象的测试通过是一个【恒成立】的结果。

    5.2 assert.notDeepEqual(actual, expected[, message])

    【notDeepEqual() 】为 【deepEqual() 】的逆运算,如果 actual!= expected 则断言通过,不同于notEqual()的是对于引用类型是对值进行判断,不比对原型、不可枚举属性,只比对自有可枚举属性,断言通过。

  11. 11

    上面代码中最后一个表达式断言通过,说明【不比对原型、不可枚举属性,只比对自有可枚举属性】

    【注意!!】与notEqual的区别,也就是deepEqual和equal的区别,在引用数据类型的时候,deepEqual是比较的值而非引用,equal对比的是引用,所以引用类型在equal的时候是永远无法通过断言测试的,以此类推,引用类型在notEqual时是永远否可以通过断言测试的。

    六. 判断预期值和实际值严格不相等(!==)

    上面总结到了判断预期值和实际值严格相等,这儿总结一下判断预期值和实际值严格不相等的两个测试函数,实际上就是上面 (四) 的逆运算

    6.1 assert.notStrictEqual(actual, expected[, message])

    如果actual与expected不 !== 则断言通过, 与 assert.deepStrictEqual() 相反

  12. 12

    6.2 assert.notDeepStrictEqual(actual, expected[, message])

    notDeepStrictEqual()就是deepStrictEqual()的逆运算,如果 actual !== expected 则断言通过,否则抛出AssertionError。

  13. 13

    七. 断言错误并抛出

    这一组有 四 个(可以说是 三 个)测试函数,是对错误进行的处理。

    7.1 assert.fail(message)

    这个测试函数不多说,可以看错是下一个函数的重载,用于主动抛出带有【message】属性的【AssertionError】对象

  14. 14

    7.2 assert.fail(actual, expected[, message[, operator[, stackStartFunction]]])

    该测试函数用于主动抛出自定义错误信息,抛出错误信息格式:【actual 参数 + operator 参数 + expected 参数】

  15. 15

    7.3 assert.throws(block,error, message)

    参数说明:

    block | Function

    error | RegExp | Function

    message | any

    【说明!!】如果block抛出的错误满足error参数,也就是抛出错误与期望一致,则断言通过,否则抛出block中的错误,如果block不抛出错误,则抛出【AssertionError 】。

    【提示!!】error 参数可以是构造函数、正则表达式、或自定义函数。

  16. 16

    上面代码中 error 参数为正则表达式,【block】抛出的错误满足正则表达式,所以断言通过。 

    【注意!!】error 参数不能是字符串。 如果第二个参数是字符串,则视为省略 error 参数,传入的字符串会被用于 【message】 参数,

  17. 17

    7.4 assert.doesNotThrow(block, error, message)

    【说明!!】预期的错误和实际的错误一致时,不抛出实际错误,抛出AssertionError,不一致则抛出实际错误信息

  18. 18

    八. 判断值是否为真

    这儿只有一个测试函数了

    8.1 assert.ifError(value)

    如果value的值为真或者可以转换成true,则抛出value,否则断言通过。

来源:百闻(微信/QQ号:9397569),转载请保留出处和链接!


本文链接:https://www.ibaiwen.com/web/246579.html

张子豪

张子豪

TA很懒,啥都没写...

@百闻娱乐 本站部分内容转自互联网,若有侵权等问题请及时与本站联系,我们将在第一时间删除处理。 | 粤ICP备2024343649号 | (地图