niayyy

断言(Assertion) API · 写给不耐烦的程序员的 JavaScript (测试版)

原文链接: exploringjs.com

7. 断言 API

7.1. 在软件开发中的断言

在软件开发中,断言必须声明正确的值和代码块。否则,将会抛出异常。Node.js 建议通过其内置的 asset 模块使用断言,例子:

import {strict as assert} from 'assert';
assert.equal(3 + 5, 8);

这个断言声明 3 + 5 的预期结果是 8,这个 import 声明使用了 assert 中推荐的严格版本

7.2. 本书中如何使用断言

在本书中,断言被用在两种途径:记录示例代码的结果和实施测试驱动的练习

7.2.1 通过断言记录示例代码的结果

在示例代码中,断言表示了预期的结果。例如,下面的函数:

function id(x) {
  return x;
}

id() 返回它的参数 x,我们可以通过断言展示它的作用:

assert.equal(id('abc'), 'abc');

在示例代码中,我通常忽略导入 assert 的语句。

使用断言背后的动机是:

  • 你可以精确地指出期待的结果。

  • 示例代码可以被自动化测试,确保他们可以正常工作。

7.2.2. 通过断言来实施测试驱动的练习

这本书的练习是使用 AVA 测试框架的测试驱动,通过 assert 方法进行内部测试

有一个测试的例子如下:

// For the exercise, you must implement the function hello().
// The test checks if you have done it properly.
test('First exercise', () => {
  assert.equal(hello('world'), 'Hello world!');
  assert.equal(hello('Jane'), 'Hello Jane!');
  assert.equal(hello('John'), 'Hello John!');
  assert.equal(hello(''), 'Hello !');
});

更多信息,参考9. 测试和练习入门

7.3. 正常对比 vs 深度对比

严格的 equal() 使用 === 去比较值,因此,一个对象仅和自身相等 – 即使另一个对象有相同的内容(因为 === 不比较对象的内容,仅仅比较他们的堆地址)

assert.notEqual({foo: 1}, {foo: 1});

deepEqual() 对于比较对象是个更好的选择:

assert.deepEqual({foo: 1}, {foo: 1});

对于 Array 来说依旧合适:

assert.notEqual(['a', 'b', 'c'], ['a', 'b', 'c']);
assert.deepEqual(['a', 'b', 'c'], ['a', 'b', 'c']);

7.4. 快速链接:assert 模块

有关完整文档,请参阅 Node.js assert

7.4.1. 正常相等

  • function equal(actual: any, expected: any, message?: string): void

    assert.equal(3+3, 6);
    
    
  • function notEqual(actual: any, expected: any, message?: string): void

    assert.notEqual(3+3, 22);
    
    

7.4.2. 深度相等

  • function deepEqual(actual: any, expected: any, message?: string): void

    assert.deepEqual([1,2,3], [1,2,3]);
    assert.deepEqual([], []);
    
    // To .equal(), an object is only equal to itself:
    assert.notEqual([], []);
    
    
  • function notDeepEqual(actual: any, expected: any, message?: string): void

    assert.notDeepEqual([1,2,3], [1,2]);
    
    

7.4.3. 预期的例外情况

如果你想(或者期望)抛出错误,你需要使用 throw():第一个参数为一个函数 block,只有在抛出错误才算成功,其它的参数被用于验证错误实例。

  • function throws(block: Function, message?: string): void

    assert.throws(
      () => {
        null.prop;
      }
    );
    
    
  • function throws(block: Function, error: Function, message?: string): void

    assert.throws(
      () => {
        null.prop;
      },
      TypeError
    );
    
    
  • function throws(block: Function, error: RegExp, message?: string): void

    assert.throws(
      () => {
        null.prop;
      },
      /^TypeError: Cannot read property 'prop' of null$/
    );
    
    
  • function throws(block: Function, error: Object, message?: string): void

    assert.throws(
      () => {
        null.prop;
      },
      {
        name: 'TypeError',
        message: Cannot read property 'prop' of null,
      }
    );
    
    

7.4.4. 其他工具类函数

  • function fail(message: string | Error): never

    try {
      functionThatShouldThrow();
      assert.fail();
    } catch (_) {
      // Success
    }
    
    

测验

参阅测试应用程序

评论

下一篇: 8. 测试和练习入门