1. 程式人生 > >Node.js 文件v4.6.1翻譯 (1) 斷言測試 assert

Node.js 文件v4.6.1翻譯 (1) 斷言測試 assert

關於這個文件

這個文件的目的是為了全面的闡述Nodejs API,本文將從現有的模組和概念方面入手。每部分將解釋一個模組或者概念。屬性型別,方法引數和事件處理的引數都會在合適的地方詳細的以列表的形式提供在標題的底下。

一個簡單的Node.js用法例子

一個用Node.js寫的伺服器,並提供‘Hello World’的回覆。
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200
; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); })
; server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
如果要執行這個例子,我們需要把這個程式碼片放在一個example.js的檔案裡,然後用node執行。
$ node example.js
Server running at http://127.0.0.1:3000/

斷言測試 assert

assert 模組提供了一套斷言測試功能。這個模組是為Nodejs內部使用設計的, 但是也可以經過require(‘assert’)外部呼叫。 但是,這個模組並不是一個測試框架,而且也不是為了當作斷言庫而設計的。assert模組的API是鎖住的,這意味著不能作任何更改和重寫。

assert(value[, message]) v0.5.9 加入

assert.ok()的別名。

const assert = require('assert');

assert(true);  // OK
assert(1);     // OK
assert(false);
  // throws "AssertionError: false == true"
assert(0); // throws "AssertionError: 0 == true" assert(false, 'it\'s false'); // throws "AssertionError: it's false"

assert.deapEqual(actual, expected[, message]) v0.1.21 加入

真實值和期望值的完全等於性。原始值的比較是用 == 運算子。
只有可以列舉的自身屬性可用。deepEqual() 無法測試原型,附帶的符號,和不能列舉的屬性, 這會帶來一些很好玩的結果。例如, 下面這個例子會丟擲一個Assertion異常,因為Error屬性是無法列舉的。

// WARNING: This does not throw an AssertionError!
assert.deepEqual(Error('a'), Error('b'));

“完全”相等的完全意味著自身可列舉屬性的子物件也要比較(基本就是object要完全相等,包括其中的子物件。):

const assert = require('assert');

const obj1 = {
  a : {
    b : 1
  }
};
const obj2 = {
  a : {
    b : 2
  }
};
const obj3 = {
  a : {
    b : 1
  }
}
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);
  // OK, object is equal to itself

assert.deepEqual(obj1, obj2);
  // AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
  // values of b are different

assert.deepEqual(obj1, obj3);
  // OK, objects are equal

assert.deepEqual(obj1, obj4);
  // AssertionError: { a: { b: 1 } } deepEqual {}
  // Prototypes are ignored

如果資料不等, 會被丟擲一個可以自定義message的異常。如果message缺失,則是用預設的錯誤資訊。

assert.deapStrictEqual(actual, expected[, message]) v1.2.0 加入
大體上和 deepEqual相似,除了兩個不同。第一原始值用嚴格相等運算子(===)比較,第二嚴格相等包括原型。

const assert = require('assert');

assert.deepEqual({a:1}, {a:'1'});
  // OK, because 1 == '1'

assert.deepStrictEqual({a:1}, {a:'1'});
  // AssertionError: { a: 1 } deepStrictEqual { a: '1' }
  // because 1 !== '1' using strict equality

異常資訊定義和deapEqual一樣

assert.doesNotThrow(block[, error][, message]) v0.1.21加入

斷言block函式不會丟擲異常。當這個函式被呼叫的時候,他會立即呼叫block函式。
如果一個異常被丟擲並且和指定的error一樣那麼丟擲AssertionError。如果不一樣則還給原函式,也就是意味著丟擲原有的異常。

assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value');
  },
  SyntaxError
);//丟擲TypeError
assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value');
  },
  TypeError
);//丟擲 AssertionError: Got unwanted exception (TypeError)
assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value');
  },
  TypeError,
  'Whoops'
);//丟擲AssertionError: Got unwanted exception (TypeError). Whoops

assert.equal(actual, expected[, message]) v0.1.21加入

測試強等於,和 == 運算子一樣。

const assert = require('assert');

assert.equal(1, 1);
  // OK, 1 == 1
assert.equal(1, '1');
  // OK, 1 == '1'

assert.equal(1, 2);
  // AssertionError: 1 == 2
assert.equal({a: {b: 1}}, {a: {b: 1}});
  //AssertionError: { a: { b: 1 } } == { a: { b: 1 } }

assert.fail(actual, expected, message, operator) v0.1.21加入

如果message缺失,那麼異常資訊為 真實值 運算子 期望值。

const assert = require('assert');

assert.fail(1, 2, undefined, '>');
  // AssertionError: 1 > 2

assert.fail(1, 2, 'whoops', '>');
  // AssertionError: whoops

assert.ifError(value) v0.1.97加入

當value是真值,丟擲值為value的異常。這個在檢測會掉函式中的error引數很有用。

const assert = require('assert');

assert.ifError(0); // OK
assert.ifError(1); // Throws 1
assert.ifError('error') // Throws 'error'
assert.ifError(new Error()); // Throws Error

assert.notDeapEqual(actual, expected[, message]) v0.1.21 加入

測試深不等,和deepEqual相反。

const assert = require('assert');

const obj1 = {
  a : {
    b : 1
  }
};
const obj2 = {
  a : {
    b : 2
  }
};
const obj3 = {
  a : {
    b : 1
  }
}
const obj4 = Object.create(obj1);

assert.notDeepEqual(obj1, obj1);
  // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }

assert.notDeepEqual(obj1, obj2);
  // OK, obj1 and obj2 are not deeply equal

assert.notDeepEqual(obj1, obj3);
  // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }

assert.notDeepEqual(obj1, obj4);
  // OK, obj1 and obj2 are not deeply equal

assert.notDeapStrictEqual(actual, expected[, message]) v1.2.0 加入

測試嚴格深不等,和deepStrictEqual相反。

const assert = require('assert');

assert.notDeepEqual({a:1}, {a:'1'});
  // AssertionError: { a: 1 } notDeepEqual { a: '1' }

assert.notDeepStrictEqual({a:1}, {a:'1'});
  // OK

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

和equal相反。等同於!=

const assert = require('assert');

assert.notEqual(1, 2);
  // OK

assert.notEqual(1, 1);
  // AssertionError: 1 != 1

assert.notEqual(1, '1');
  // AssertionError: 1 != '1'

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

和StrictEuqal相反, 等同於 !==

const assert = require('assert');

assert.notStrictEqual(1, 2);
  // OK

assert.notStrictEqual(1, 1);
  // AssertionError: 1 != 1

assert.notStrictEqual(1, '1');
  // OK

assert.ok(value[, message])

判斷value是否為真。等同於 assert.equal(!!value, true, message)

const assert = require('assert');

assert.ok(true);  // OK
assert.ok(1);     // OK
assert.ok(false);
  // throws "AssertionError: false == true"
assert.ok(0);
  // throws "AssertionError: 0 == true"
assert.ok(false, 'it\'s false');
  // throws "AssertionError: it's false"

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

等同於 ===

const assert = require('assert');

assert.strictEqual(1, 2);
  // AssertionError: 1 === 2

assert.strictEqual(1, 1);
  // OK

assert.strictEqual(1, '1');
  // AssertionError: 1 === '1'

assert.throws(block[, error][, message]) v0.1.21加入

檢查block函式是否丟擲異常。如果指定error,它可以是正則,驗證函式或者建構函式。

assert.throws(
  () => {
    throw new Error('Wrong value');
  },
  Error
);// 建構函式
assert.throws(
  () => {
    throw new Error('Wrong value');
  },
  /value/
);// 正則
assert.throws(
  () => {
    throw new Error('Wrong value');
  },
  function(err) {
    if ( (err instanceof Error) && /value/.test(err) ) {
      return true;
    }
  },
  'unexpected error'
);// 自定義的驗證函式

注意這裡error不可以是一個字串,如果字串被當作第二個引數,那麼error引數項被忽略,字串被當作異常資訊。這個是常見易錯處。

// THIS IS A MISTAKE! DO NOT DO THIS! 錯的不要這樣
assert.throws(myFunction, 'missing foo', 'did not throw with expected message');

// Do this instead. 這樣
assert.throws(myFunction, /missing foo/, 'did not throw with expected message');