アサーションは、何らかのブール式として表現されるプログラミング用語であり、プログラマーは、プログラム内の特定の時点で式の値が true であると信じます。そのため、アサーションの検証はいつでも有効または無効にできるため、無効になっているテスト中にアサーションを有効にすることができます。デプロイ時のアサーション。同様に、プログラムの実行中に問題が発生した場合、エンド ユーザーはアサーションを再度有効にすることができます。
アサーションを使用して、より安定し、品質が高く、エラーが発生しにくいコードを作成します。値が FALSE のときに現在の操作を中断する必要がある場合は、アサーションを使用できます。 [単体テスト] アサーションを使用する必要があります。
Node は、不変条件をテストするための 10 を超えるアサーション テスト関数を提供します。理解と記憶を容易にするために、記事内でこれら 10 を超える関数をグループ化しました。
【ヒント】この記事では、expectedは期待値、actualは実際の値、messageはカスタム情報を表します
2.値が真の値であるかどうかを判断する
値が真の値であるかどうかを判断するには、次の 2 つのアサーション テスト関数があります
2.1assert(value[, message])
このテスト関数は、[Boolean(value)] が [true] の場合にアサーション テストに合格し、それ以外の場合は [AssertionError] をスローします
const assert = require("assert"); assert("blue","第一个值为false时以我为错误信息抛出"); assert(true,"第一个值为false时以我为错误信息抛出");
上記のコードは [Boolean(value) ] がすべて true であるため、すべてアサーション テストに合格します
assert(false,"第一个值为false时以我为错误信息抛出"); // AssertionError [ERR_ASSERTION]: 第一个值为false时以我为错误信息抛出
上記のコードでは、値が false の場合、message 属性を持つ [AssertionError] がスローされます。 message 属性の値は、受信メッセージ パラメータの値と等しくなります。 [メッセージパラメータが定義されていない場合、デフォルトのエラーメッセージが割り当てられます]。
assert(false); // AssertionError [ERR_ASSERTION]: false == true
上記のコードでは[message]パラメータが指定されていないため、デフォルトのエラーメッセージは[AssertionError]がスローされます
2.2assert.ok(value[, message])
assert.ok()の役割とassert() これらは同じであり、すべて [value] が true 値であるかどうかをテストします。使い方も同じなので、assert()はassert.ok()の糖衣構文とみなすことができます
const assert = require("assert"); assert.ok(true); assert.ok(1);
上記のコード[Boolean(value)]はすべてtrueなので、すべてのアサーションが通ります。アサーションが失敗する場所をそれぞれ示します
assert.ok(0); //AssertionError [ERR_ASSERTION]: 0 == true assert.ok(false); //AssertionError [ERR_ASSERTION]: false == true assert.ok(false,"自定义错误信息"); //AssertionError [ERR_ASSERTION]: 自定义错误信息
3. 期待値と実際の値が等しいかどうかを判断します (==)。このグループには 2 つのテスト関数があり、期待値と実際の値が等しい場合、アサーションは合格し、そうでない場合は throw [AssertionError]
3.1assert.equal(actual, Expected[, message])
assert.equal() を使用してかどうかをテストします。期待値と実際の値が等しい、[値の型を比較する場合、2 つが比較されます。値が等しいかどうか、期待値と実際の値が参照型の場合、比較は参照に値します]
assert.equal(1, 1); assert.equal("1", 1);
上記のコードは値の型の比較であり、equal() が内部的に (==) を使用していることを示しています。非厳密な等価です。後で厳密な等価 (===) に要約します
assert.equal({},{},"AssertionError"); assert.equal(() => { }, () => { }, "AssertionError"); assert.equal([],[],'AssertionError');
上記の 3 つの式はスローします[メッセージ] 属性値が 'AssertionError' である [AssertionError] オブジェクト、[したがって、値が参照である場合、型を比較するとき、equal() は値参照を比較するため、2 つの参照型の値は、equal によってアサートできません()]
const obj={}; assert.equal(obj,obj); // 断言通过
上記のコードは同じオブジェクトを比較しているため、2 つの値の参照は等しいため、アサーションはパスします。
3.2assert.deepEqual(actual, Expected[, message])
また、期待値と実際の値が等しいかどうかをテストしますが、等しいとは異なり、参照を比較するときに [deepEqual()] を使用します。型、比較される値の参照ではなく、比較されるオブジェクトの属性値です]
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
上記は値の型の比較であり、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
上記参照型を比較すると、[deepEqual()] は参照ではなく属性値を比較することがわかります。これは、equal() とは異なります。
【注意! ! 】deepEqual() は、独自の列挙可能なプロパティのみをテストし、オブジェクトのプロトタイプ、コネクタ、または列挙不可能なプロパティはテストしません (これらの場合は、assert.deepStrictEqual() を使用します。これについては後でまとめます)。上記のコードson1とson2はそれぞれ2つの異なるオブジェクトから継承しており、両方とも「Summer」という名前の属性を持ち、[deepEqual()がオブジェクトのプロトタイプをテストしない]ことを示す最終結果が渡されます
const son1 = Object.create(obj1), son2 = Object.create(obj2); son1.name="Summer"; son2.name="Summer"; assert.deepEqual(son1,son2,"actual unequal to expected"); // 断言通过
上記のコードでは、 ena と enb が使用されています 同じ列挙可能属性 [name] に対して、異なる値を持つ非列挙可能属性 [hobby] が存在します。これは、[deepEqual() がオブジェクトの非列挙可能属性をテストしない] ことを示しています。
4.期待値と実際の値が一致するかどうかを判断する (===)
この一連のテスト関数は、期待値と実際の値が深さが等しいかどうかを判断するために使用されます (===)。オブジェクトのプロトタイプも比較され、値の型も比較の範囲になります。このセットには 2 つのテスト機能もあります。
4.1assert.deepStrictEqual(actual, Expected[, message])
内部的には合同(===)を使っているため、オブジェクトのプロトタイプも比較範囲に含まれます
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
上記のコードはdeepEqual( ) アサーション テストは deepStrictEqual() で実行されました。son1 と Son2 はそれぞれ 2 つの異なるオブジェクトを継承しますが、同じ属性値を持ちます。 [deepEqual() はオブジェクトのプロトタイプを考慮せず、deepStrictEqual() はプロトタイプ オブジェクトを比較オブジェクトとして含めます]
4.2assert.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'); // 测试通过。
【提示!!】对引用类型还是永远通不过【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 参数。
相关推荐:
以上がNode.jsでのassertの使用例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。