Heim  >  Artikel  >  Web-Frontend  >  Teilen Sie Beispiele für die Verwendung von Assert in node.js

Teilen Sie Beispiele für die Verwendung von Assert in node.js

小云云
小云云Original
2018-01-29 17:27:471354Durchsuche

Behauptung ist ein Programmierbegriff, der als boolescher Ausdruck ausgedrückt wird. Der Programmierer geht davon aus, dass der Ausdruckswert an einem bestimmten Punkt im Programm wahr ist. Die Bestätigung der Behauptung kann jederzeit aktiviert und deaktiviert werden, sodass Behauptungen während des Tests aktiviert werden können Und deaktivieren Sie Behauptungen bei der Bereitstellung. Ebenso können Endbenutzer Assertionen wieder aktivieren, sobald das Programm ausgeführt wird, wenn sie auf Probleme stoßen.

Verwenden Sie Behauptungen, um Code zu erstellen, der stabiler, qualitativ hochwertiger und weniger fehleranfällig ist. Wenn Sie den aktuellen Vorgang unterbrechen müssen, wenn ein Wert FALSE ist, können Sie Zusicherungen verwenden. [Unit Test] Es müssen Behauptungen verwendet werden.

Node bietet mehr als 10 Behauptungstestfunktionen zum Testen von Invarianten. Ich habe diese mehr als 10 Funktionen im Artikel gruppiert, um das Verständnis und die Erinnerung zu erleichtern.

[Tipp] In diesem Artikel steht „erwartet“ für den erwarteten Wert, „tatsächlich“ für den tatsächlichen Wert und „Nachricht“ für benutzerdefinierte Informationen

2. Bestimmen Sie, ob der Wert ein wahrer Wert ist

Beurteilen Sie, ob der Wert wahr ist oder nicht, es gibt die folgenden zwei Behauptungstestfunktionen

2.1 affirm(value[, message])

Diese Testfunktion besteht die Behauptung, wenn [Boolean( value)] ist [true] Test, andernfalls wird [AssertionError] ausgegeben

const assert = require("assert");

assert("blue","第一个值为false时以我为错误信息抛出");

assert(true,"第一个值为false时以我为错误信息抛出");

Da [Boolean(value)] im obigen Code alle wahr sind, bestehen sie alle den Assertionstest

assert(false,"第一个值为false时以我为错误信息抛出");

// AssertionError [ERR_ASSERTION]: 第一个值为false时以我为错误信息抛出

Der Wert im obigen Code ist Wenn falsch, wird ein [AssertionError] mit einem Nachrichtenattribut ausgelöst, wobei der Wert des Nachrichtenattributs gleich dem Wert des eingehenden Nachrichtenparameters ist. [Wenn der Nachrichtenparameter nicht definiert ist, wird die Standardfehlermeldung zugewiesen].

assert(false);
// AssertionError [ERR_ASSERTION]: false == true

Da der Parameter [message] im obigen Code nicht angegeben ist, wird die Standardfehlermeldung [AssertionError] ausgegeben

2.2assurance.ok(value[, message])

assert.ok() hat die gleiche Funktion wie Assert(), beide testen, ob [Wert] wahr ist. Und die Verwendung ist die gleiche, sodass Assert() als syntaktischer Zucker von Assert.ok() betrachtet werden kann

const assert = require("assert");
assert.ok(true);
assert.ok(1);

Der obige Code [Boolean(value)] ist alles wahr, sodass alle Behauptungen erfolgreich sind . Das Folgende ist die Behauptung: Im Fehlerfall werden die Standardfehlermeldungen jeweils aufgelistet

assert.ok(0);
//AssertionError [ERR_ASSERTION]: 0 == true

assert.ok(false);
//AssertionError [ERR_ASSERTION]: false == true

assert.ok(false,"自定义错误信息");
//AssertionError [ERR_ASSERTION]: 自定义错误信息

3. Beurteilen Sie, dass der erwartete Wert und der tatsächliche Wert gleich sind (==)

In dieser Gruppe gibt es zwei Testfunktionen. Wird verwendet, um zu testen, ob der erwartete Wert dem tatsächlichen Wert entspricht. Wenn sie gleich sind, wird die Behauptung bestanden, andernfalls wird [AssertionError]

3.1assurance.equal(actual) ausgegeben , erwartet[, Nachricht])

assert equal() wird verwendet, um zu testen, ob der erwartete Wert und der tatsächliche Wert gleich sind [Wenn der Werttyp ein Werttyp ist, wird der Vergleich durchgeführt Wenn der erwartete Wert und der tatsächliche Wert Referenztypen sind, besteht der Vergleich darin, ob sie referenzwürdig sind.]

assert.equal(1, 1);
assert.equal("1", 1);

Der obige Code ist ein Vergleich von Werttypen, der angibt, dass sie gleich sind( ) verwendet intern (==) anstelle von strikter Gleichheit (===).

assert.equal({},{},"AssertionError");
assert.equal(() => { }, () => { }, "AssertionError");
assert.equal([],[],'AssertionError');

Die obigen drei Ausdrücke lösen ein [AssertionError]-Objekt aus, dessen [message]-Attributwert ist 'AssertionError', [wenn der Wert also ein Referenztyp ist, vergleicht equal() den Wert der Referenz, sodass zwei Referenztypwerte nicht durch equal() bestätigt werden können]

const obj={};
assert.equal(obj,obj);
// 断言通过

Seitdem Der obige Code vergleicht dasselbe Objekt, die beiden Wertreferenzen sind gleich, sodass die Behauptung bestanden wird.

3.2 affirm.deepEqual(actual, erwartet[, message])

Es testet auch, ob der erwartete Wert und der tatsächliche Wert gleich sind. Es wird immer noch (==) verwendet, aber das ist der Fall verschieden von equal. Ja, [wenn deepEqual() Referenztypen vergleicht, vergleicht es nicht die Referenz des Werts, sondern den Attributwert des verglichenen Objekts]

const a = 'Blue', b = 'Pink';
assert.deepEqual(a,a,'actual unequal to expected');
// 断言通过
assert.deepEqual(a,b,'actual unequal to expected');
// AssertionError [ERR_ASSERTION]: actual unequal to expected

Das Obige ist ein Wertvergleich Es gibt keinen Unterschied zwischen equal()

const obj1 = { name: "foo", gender: "men" },
 obj2 = { name: "foo", gender: "men" },
 obj3 = { name: "bar", gender: "men" }
assert.deepEqual(obj1, obj2, 'actual unequal to expected');
// 断言通过
assert.deepEqual(obj1, obj3, 'actual unequal to expected');
// AssertionError [ERR_ASSERTION]: actual unequal to expected

Der obige Code ist ein Vergleich von Referenztypen. Es ist ersichtlich, dass [deepEqual()] Attributwerte vergleicht as equal() Verschiedene Orte.

【Achtung! ! 】deepEqual() testet nur seine eigenen aufzählbaren Eigenschaften und nicht den Prototyp, den Connector oder die nicht aufzählbaren Eigenschaften des Objekts (verwenden Sie in diesen Fällen Assert.deepStrictEqual(), was später zusammengefasst wird)

const son1 = Object.create(obj1),
 son2 = Object.create(obj2);

son1.name="Summer";
son2.name="Summer";

assert.deepEqual(son1,son2,"actual unequal to expected");
// 断言通过

Im obigen Code erben son1 und son2 jeweils von zwei verschiedenen Objekten, die beide das Attribut „Summer“ haben. Das Endergebnis wird übergeben, was darauf hinweist, dass [deepEqual() den Prototyp des Objekts nicht testet ]

const ena = {}, enb = {};
Object.defineProperties(ena,{
 name:{
 value:"Blue"
 },
 hobby:{
 value:"foo",
 enumerable:false //可枚举性设置为false
 }
});
Object.defineProperties(enb,{
 name:{
 value:"Blue"
 },
 hobby:{
 value:"bar",
 enumerable:false //可枚举性设置为false
 }
})
assert.deepEqual(ena,enb,"actual unequal to expected") 
//ok,actual equal to expected

Im obigen Code werden ena und enb für dasselbe aufzählbare Attribut [Name] verwendet und haben ein nicht aufzählbares Attribut [hobby] mit unterschiedlichen Werten, was darauf hinweist, dass [deepEqual() dies tut nicht die nicht aufzählbaren Attribute des Objekts testen]

4. Bestimmen Sie, ob der erwartete Wert und der tatsächliche Wert übereinstimmen (===)

Dieser Satz von Testfunktionen wird zur Bestimmung verwendet ob der erwartete Wert und der tatsächliche Wert zutiefst gleich sind. Die interne Verwendung ist ( ===), daher wird auch der Prototyp des Objekts verglichen, und der Werttyp ist auch der Vergleichsbereich. Dieses Set verfügt außerdem über zwei Testfunktionen.

4.1 affirm.deepStrictEqual(actual, erwartet[, message])

Da intern Kongruenz (===) verwendet wird, wird auch der Prototyp des Objekts in den Vergleichsbereich einbezogen

const obj1 = { name: "foo", gender: "men" },
 obj2 = { name: "bar", gender: "men" }
const son1 = Object.create(obj1),
 son2 = Object.create(obj2);
son1.name = "Summer";
son2.name = "Summer";
assert.deepEqual(son1, son2, "actual unequal to expected");
//断言通过
assert.deepStrictEqual(son1, son2, "actual unequal to expected")
//AssertionError [ERR_ASSERTION]: actual unequal to expected

Der obige Code verwendet deepEqual() und deepStrictEqual() für Assertionstests, son1 und son2 erben jeweils zwei verschiedene Objekte, haben aber die gleichen Attributwerte. Es ist ersichtlich, dass [deepEqual() den Prototyp des Objekts nicht berücksichtigt, deepStrictEqual() das Prototypobjekt als Vergleichsobjekt einbezieht]

4.2assurance.strictEqual(actual, erwartet[, Nachricht])

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

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

assert.strictEqual(1, 1);
// 测试通过。

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

assert.equal(1, '1');
// 测试通过。

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

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

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

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

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

assert.notEqual("1", "2");
// 断言通过

assert.notEqual("1", 2);
// 断言通过

assert.notEqual("1", 1);
// AssertionError [ERR_ASSERTION]: '1' != 1

上面代码是对值类型进行的比较,第三个表达式的默认信息可以看出内部使用的是(!=)

assert.notEqual({ a: "foo" }, { a: "foo" });

assert.notEqual(() => { }, () => { });

assert.notEqual([], []);

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

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

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

const obj1 = { a: "foo" },
 obj2 = { b: "bar" },
 obj3 = Object.create(obj1);

assert.notDeepEqual(obj1,obj1,'actual equal to expected');
// AssertionError [ERR_ASSERTION]: actual equal to expected

assert.notDeepEqual(obj1,obj2,'actual equal to expected');
// 断言通过

assert.notDeepEqual(obj1,obj3,'actual equal to expected');
// 断言通过

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

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

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

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

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

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

assert.notStrictEqual("1", 1);
// 断言通过

assert.notStrictEqual("1", "1");
// AssertionError [ERR_ASSERTION]: '1' !== '1'

上面代码是对值类型进行的断言测试,可以看出【notStrictEqual() 】考虑了数据类型

assert.notStrictEqual({ a: "foo" }, { a: "foo" });
assert.notStrictEqual(() => { }, () => { });
assert.notStrictEqual([], []);

上面代码是对引用类型的测试,全部通过,以上表达式是恒通过的。

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

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

assert.notDeepStrictEqual({ a: '1' }, { a: 1 });
//断言通过

assert.notDeepStrictEqual({ a: '1' }, { a: "1" });
//AssertionError [ERR_ASSERTION]: { a: '1' } notDeepStrictEqual { a: '1' }

七. 断言错误并抛出

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

7.1 assert.fail(message)

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

assert.fail("自定义错误信息");
// AssertionError [ERR_ASSERTION]: 自定义错误信息

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

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

assert.fail("BLUE","PINK");  
// AssertionError [ERR_ASSERTION]: 'BLUE' != 'PINK'

上面代码不提供【message】和【operator】,则【operator】默认为 【!=】

assert.fail("BLUE","PINK","自定义的错误信息");  
// AssertionError [ERR_ASSERTION]: 自定义的错误信息

assert.fail("BLUE","PINK","自定义的错误信息","?",()=>{
  console.log("hello");
 });
// AssertionError [ERR_ASSERTION]: 自定义的错误信息

上面代码提供【message】,这时候 【actual】、【operator】、【expected】等参数会被列入错误对象属性中

assert.fail("BLUE","PINK",undefined);
// AssertionError [ERR_ASSERTION]: 'BLUE' undefined 'PINK'

assert.fail("BLUE","PINK",undefined,"?");
// AssertionError [ERR_ASSERTION]: 'BLUE' ? 'PINK'

上面代码是【message】为 undefined 时,会检测【operator】参数,【operator?operator:undefined 】

7.3 assert.throws(block,error, message)

参数说明:

block | Function

error | RegExp | Function

message | any

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

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

assert.throws(
 () => {
  throw new Error('错误信息');
 },
 Error
);

上面代码中 error 参数为构造函数,【block】抛出的错误与预期的一致,所以断言通过。

assert.throws(
 () => {
  throw new Error('错误信息');
 },
 /错误/
);

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

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

// 这是错误的!不要这么做!
assert.throws(myFunction, '错误信息', '没有抛出期望的信息');

// 应该这么做。
assert.throws(myFunction, /错误信息/, '没有抛出期望的信息');

下面代码,【error】 参数为自定义函数

assert.throws(
 () => {
  throw new Error('错误信息');
 },
 function (err) {
  if ((err instanceof Error) && /错误/.test(err)) {
   return true;
  }
 },
 '不是期望的错误'
);

7.4 assert.doesNotThrow(block, error, message)

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

assert.doesNotThrow(
 () => {
 throw new TypeError('错误信息');
 },
 SyntaxError
);

以上例子会抛出 TypeError,因为在断言中没有匹配的错误类型

assert.doesNotThrow(
 () => {
 throw new TypeError('错误信息');
 },
 TypeError
);

以上例子会抛出一个带有 Got unwanted exception (TypeError).. 信息的 AssertionError

assert.doesNotThrow(
 () => {
 throw new TypeError('错误信息');
 },
 TypeError,
 '抛出错误'
);
// 抛出 AssertionError: Got unwanted exception (TypeError). 抛出错误

上面代码说明:如果抛出了 AssertionError 且有给 message 参数传值,则 message 参数的值会被附加到 AssertionError 的信息中

八. 判断值是否为真

这儿只有一个测试函数了

8.1 assert.ifError(value)

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

assert.ifError(true); 
//抛出true

assert.ifError(false);
//断言通过

上面代码中是直接给出的 布尔 类型的值,如果值为 true 则会将该值抛出,否则什么也不做

assert.ifError(0);
//断言通过

assert.ifError("0");
//抛出 "0"

assert.ifError(1);
//抛出 1

assert.ifError(new Error());
//抛出 Error,对象名称

上面代码中全部是通过 Boolean(value) 转换之后再进行的测试,利用这个特性我们可以将此测试函数用于测试回调函数的 error 参数。

相关推荐:

关于console.assert的3篇课程推荐

Das obige ist der detaillierte Inhalt vonTeilen Sie Beispiele für die Verwendung von Assert in node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn