Maison > interface Web > js tutoriel > Partager des exemples d'utilisation d'assert dans node.js

Partager des exemples d'utilisation d'assert dans node.js

小云云
Libérer: 2018-01-29 17:27:47
original
1392 Les gens l'ont consulté

L'assertion est un terme de programmation, exprimé sous la forme d'une expression booléenne, le programmeur estime que la valeur de l'expression est vraie à un certain moment du programme. La vérification des assertions peut être activée et désactivée à tout moment, de sorte que les assertions peuvent être activées pendant les tests. Et désactivez les assertions lors du déploiement. De même, une fois le programme exécuté, les utilisateurs finaux peuvent réactiver les assertions s'ils rencontrent des problèmes.

Utilisez des assertions pour créer un code plus stable, de meilleure qualité et moins sujet aux erreurs. Lorsque vous devez interrompre l'opération en cours lorsqu'une valeur est FALSE, vous pouvez utiliser des assertions. [Test unitaire] Doit utiliser des assertions.

Node fournit plus de 10 fonctions de test d'assertion pour tester les invariants. J'ai regroupé ces plus de 10 fonctions dans l'article pour faciliter la compréhension et la mémoire.

[Astuce] Dans cet article, attendu représente la valeur attendue, réel représente la valeur réelle et le message représente des informations personnalisées

2 Déterminez si la valeur est une vraie valeur

<.>Juger Que la valeur soit vraie ou non, il existe les deux fonctions de test d'assertion suivantes

2.1 assert(value[, message])

Cette fonction de test réussit l'assertion lorsque [Boolean( value)] est [true] Test, sinon il lancera [AssertionError]

const assert = require("assert");

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

assert(true,"第一个值为false时以我为错误信息抛出");
Copier après la connexion
Puisque [Boolean(value)] dans le code ci-dessus sont tous vrais, ils réussissent tous le test d'assertion

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

// AssertionError [ERR_ASSERTION]: 第一个值为false时以我为错误信息抛出
Copier après la connexion
La valeur dans le code ci-dessus est Si fausse, une [AssertionError] avec un attribut de message est levée, où la valeur de l'attribut de message est égale à la valeur du paramètre de message entrant. [Si le paramètre de message n'est pas défini, le message d'erreur par défaut sera attribué].

assert(false);
// AssertionError [ERR_ASSERTION]: false == true
Copier après la connexion
Étant donné que le paramètre [message] n'est pas spécifié dans le code ci-dessus, le message d'erreur par défaut [AssertionError] est généré

2.2 assert.ok(value[, message])

assert.ok() a la même fonction que assert(), ils testent tous les deux si [value] est vraie. Et l'utilisation est la même, donc assert() peut être considéré comme le sucre syntaxique de assert.ok()

const assert = require("assert");
assert.ok(true);
assert.ok(1);
Copier après la connexion
Le code ci-dessus [Boolean(value)] est tout vrai, donc toutes les assertions passent . Ce qui suit est l'affirmation En cas d'échec, les messages d'erreur par défaut sont répertoriés respectivement

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

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

assert.ok(false,"自定义错误信息");
//AssertionError [ERR_ASSERTION]: 自定义错误信息
Copier après la connexion
3. Jugant que la valeur attendue et la valeur réelle sont égales (==)

. Il y a deux fonctions de test dans ce groupe, utilisées pour tester si la valeur attendue est égale à la valeur réelle. Si elles sont égales, l'assertion réussit, sinon elle renvoie [AssertionError]

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

assert. equal() est utilisé pour tester si la valeur attendue et la valeur réelle sont égales [Lorsque le type valeur est un type valeur, la comparaison consiste à savoir si les deux valeurs. ​​sont égaux. Lorsque la valeur attendue et la valeur réelle sont des types de référence, la comparaison consiste à savoir si elles sont dignes de référence]

assert.equal(1, 1);
assert.equal("1", 1);
Copier après la connexion
Le code ci-dessus est une comparaison de types de valeur, indiquant que l'égalité ( ) utilise (==) en interne au lieu de l'égalité stricte. Je résumerai l'égalité stricte (===) plus tard

assert.equal({},{},"AssertionError");
assert.equal(() => { }, () => { }, "AssertionError");
assert.equal([],[],'AssertionError');
Copier après la connexion
Les trois expressions ci-dessus lanceront un objet [AssertionError] dont la valeur d'attribut [message]. est 'AssertionError', [donc lorsque la valeur est un type référence, égal() compare la valeur de la référence, donc deux valeurs de type référence ne peuvent pas être affirmées par égal()】

const obj={};
assert.equal(obj,obj);
// 断言通过
Copier après la connexion
Depuis le code ci-dessus compare le même objet, les deux références de valeur sont égales, donc l'assertion réussit.

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

Il teste également si la valeur attendue et la valeur réelle sont égales. Il utilise toujours (==), mais c'est le cas. différent de égal. Oui, [lorsque deepEqual() compare les types de référence, il ne compare pas la référence de la valeur, mais la valeur d'attribut de l'objet comparé]

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
Copier après la connexion
Ce qui précède est une comparaison de valeur. types. Il n'y a pas de différence entre égal()

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
Copier après la connexion
Le code ci-dessus est une comparaison des types de référence. On peut voir que [deepEqual()] compare les valeurs d'attribut, pas les références. as égal() Différents endroits.

【Attention ! ! 】deepEqual() teste uniquement ses propres propriétés énumérables, et ne teste pas le prototype, le connecteur ou les propriétés non énumérables de l'objet (utilisez assert.deepStrictEqual() dans ces cas, qui seront résumés plus tard)

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

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

assert.deepEqual(son1,son2,"actual unequal to expected");
// 断言通过
Copier après la connexion
Dans le code ci-dessus, son1 et son2 héritent respectivement de deux objets différents, qui ont tous deux l'attribut nommé "Summer". Le résultat final est transmis, indiquant que [deepEqual() ne teste pas le prototype de l'objet]

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
Copier après la connexion
Dans le code ci-dessus, ena et enb sont utilisés pour le même attribut énumérable [name], et ont un attribut non énumérable [hobby] avec des valeurs différentes, indiquant que [deepEqual() ne teste pas les attributs non énumérables de l'objet]

4. Déterminer si la valeur attendue et la valeur réelle sont congruentes (===)

Cet ensemble de fonctions de test est utilisé pour déterminer si le La valeur attendue et la valeur réelle sont profondément égales. L'utilisation interne est ( ===), donc le prototype de l'objet sera également comparé, et le type de valeur est également la portée de la comparaison. Cet ensemble dispose également de deux fonctions de test.

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

La congruence (===) étant utilisée en interne, le prototype de l'objet sera également inclus dans la plage de comparaison

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
Copier après la connexion
Le code ci-dessus utilise deepEqual() et deepStrictEqual() pour les tests d'assertion son1 et son2 héritent respectivement de deux objets différents, mais ont les mêmes valeurs d'attribut. On peut voir que [deepEqual() ne considère pas le prototype de l'objet, deepStrictEqual() inclut l'objet prototype comme objet de comparaison]

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

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');
// 测试通过。
Copier après la connexion

【提示!!】对引用类型还是永远通不过【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
Copier après la connexion

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

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

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

assert.notEqual([], []);
Copier après la connexion

上面的代码是对引用类型进行的断言测试,【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');
// 断言通过
Copier après la connexion

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

【注意!!】与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'
Copier après la connexion

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

assert.notStrictEqual({ a: "foo" }, { a: "foo" });
assert.notStrictEqual(() => { }, () => { });
assert.notStrictEqual([], []);
Copier après la connexion

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

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' }
Copier après la connexion

七. 断言错误并抛出

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

7.1 assert.fail(message)

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

assert.fail("自定义错误信息");
// AssertionError [ERR_ASSERTION]: 自定义错误信息
Copier après la connexion

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

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

assert.fail("BLUE","PINK");  
// AssertionError [ERR_ASSERTION]: 'BLUE' != 'PINK'
Copier après la connexion

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

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

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

上面代码提供【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'
Copier après la connexion

上面代码是【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
);
Copier après la connexion

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

assert.throws(
 () => {
  throw new Error('错误信息');
 },
 /错误/
);
Copier après la connexion

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

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

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

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

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

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

7.4 assert.doesNotThrow(block, error, message)

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

assert.doesNotThrow(
 () => {
 throw new TypeError('错误信息');
 },
 SyntaxError
);
Copier après la connexion

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

assert.doesNotThrow(
 () => {
 throw new TypeError('错误信息');
 },
 TypeError
);
Copier après la connexion

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

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

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

八. 判断值是否为真

这儿只有一个测试函数了

8.1 assert.ifError(value)

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

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

assert.ifError(false);
//断言通过
Copier après la connexion

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

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

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

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

assert.ifError(new Error());
//抛出 Error,对象名称
Copier après la connexion

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

相关推荐:

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal