어설션은 일부 부울 표현식으로 표현되는 프로그래밍 용어로, 프로그래머는 프로그램의 특정 지점에서 표현식 값이 true라고 믿습니다. 어설션 검증은 언제든지 활성화 및 비활성화할 수 있으므로 비활성화하는 동안 테스트하는 동안 어설션을 활성화할 수 있습니다. 배포 시 어설션. 마찬가지로 프로그램이 실행되면 최종 사용자는 문제가 발생할 경우 어설션을 다시 활성화할 수 있습니다.
어설션을 사용하여 더 안정적이고, 품질이 더 좋고, 오류가 덜 발생하는 코드를 만드세요. 값이 FALSE일 때 현재 작업을 중단해야 하는 경우 어설션을 사용할 수 있습니다. [단위 테스트] 어설션을 사용해야 합니다.
Node는 불변성 테스트를 위한 10개 이상의 어설션 테스트 기능을 제공합니다. 기사에서는 이해와 기억을 돕기 위해 이러한 10개 이상의 기능을 그룹화했습니다.
[Tip] 이 글에서 예상값은 예상값, 실제값은 실제값, 메시지는 맞춤 정보를 나타냅니다
2. 값이 참값인지 판단하세요
값이 참값인지 판단하려면, 다음 두 가지 어설션 테스트 함수가 있습니다.
2.1 Assert(value[, message])
이 테스트 함수는 [Boolean(value)]가 [true]일 때 어설션 테스트를 통과하고, 그렇지 않으면 [AssertionError]
const assert = require("assert"); assert("blue","第一个值为false时以我为错误信息抛出"); assert(true,"第一个值为false时以我为错误信息抛出");
를 발생시킵니다. 위 코드는 [Boolean(value) 】모두 true이므로 모두 true이므로 모두 어설션 테스트를 통과합니다
assert(false,"第一个值为false时以我为错误信息抛出"); // AssertionError [ERR_ASSERTION]: 第一个值为false时以我为错误信息抛出
위 코드에서 값이 false인 경우 메시지 속성이 있는 [AssertionError]가 발생합니다. 메시지 속성의 값은 수신 메시지 매개변수의 값과 같습니다. [메시지 매개변수가 정의되지 않은 경우 기본 오류 메시지가 할당됩니다].
assert(false); // AssertionError [ERR_ASSERTION]: false == true
위 코드에는 [message] 매개변수가 지정되지 않았기 때문에 기본 오류 메시지는 [AssertionError]가 발생합니다.
2.2assert.ok(value[, message])
assert.ok()의 역할과 Assert() 그것들은 동일합니다. 모두 [value]가 참 값인지 테스트합니다. 그리고 사용법은 동일하므로 Assert()는 Assert.ok()
const assert = require("assert"); assert.ok(true); assert.ok(1);
의 문법적 설탕으로 간주할 수 있습니다. 위의 코드 [Boolean(value)]는 모두 true이므로 모든 Assertion이 통과되는 경우는 다음과 같습니다. 어설션이 각각 실패하는 경우 기본 오류 메시지가 나열됩니다.
assert.ok(0); //AssertionError [ERR_ASSERTION]: 0 == true assert.ok(false); //AssertionError [ERR_ASSERTION]: false == true assert.ok(false,"自定义错误信息"); //AssertionError [ERR_ASSERTION]: 自定义错误信息
3. 예상 값과 실제 값이 동일한지 확인합니다(==)
이 그룹에는 두 가지 테스트 함수가 있습니다. 예상 값과 실제 값이 동일하면 어설션이 통과하고, 그렇지 않으면 throw [AssertionError]
3.1 Assert.equal(actual, Expect[, message])
assert.equal()을 사용하여 여부를 테스트합니다. 기대값과 실제값이 같은 경우, [값 유형을 비교할 때 두 개를 비교합니다. 값이 같은지, 기대값과 실제값이 참조 유형일 때 비교는 참고할 가치가 있습니다]
assert.equal(1, 1); assert.equal("1", 1);
위의 코드는 값 유형을 비교한 것으로, equal()은 내부적으로 (==)와 Non-Strict Equal을 사용함을 나타내며, 나중에 엄격한 같음(===)으로 요약하겠습니다.
assert.equal({},{},"AssertionError"); assert.equal(() => { }, () => { }, "AssertionError"); assert.equal([],[],'AssertionError');
위의 세 가지 표현식은 [message] 속성 값이 'AssertionError'인 [AssertionError] 객체, [그래서 값이 참조인 경우 유형을 비교할 때 equal()은 값 참조를 비교하므로 두 참조 유형의 값은 같음으로 주장될 수 없습니다. ()】
const obj={}; assert.equal(obj,obj); // 断言通过
위 코드는 동일한 객체를 비교하므로 두 값 참조가 동일하므로 어설션이 통과됩니다.
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
위는 값 유형의 비교이고 차이는 없습니다. code is 참조 유형을 비교할 때 [deepEqual()]은 참조가 아닌 속성 값을 비교하는데, 이는 equal()과 다른 점을 알 수 있습니다.
【주의! ! 】deepEqual()은 자체 열거 가능 속성만 테스트하고 객체의 프로토타입, 커넥터 또는 열거 가능하지 않은 속성은 테스트하지 않습니다. (이 경우 나중에 요약할 Assert.deepStrictEqual()을 사용하세요.)
const son1 = Object.create(obj1), son2 = Object.create(obj2); son1.name="Summer"; son2.name="Summer"; assert.deepEqual(son1,son2,"actual unequal to expected"); // 断言通过
위 코드에서 son1과 son2는 각각 두 개의 서로 다른 개체에서 상속되며 둘 다 "Summer"라는 속성을 가지며 최종 결과가 전달되어 [deepEqual()이 개체의 프로토타입을 테스트하지 않음]
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
위 코드에서 ena와 enb가 사용됩니다. 동일한 열거 가능 속성 [name]에 대해 서로 다른 값을 갖는 열거 불가능 속성 [hobby]가 있는데, 이는 [deepEqual()이 객체의 열거 불가능 속성을 테스트하지 않음을 나타냅니다]
4. 여부를 결정합니다. 기대값과 실제값이 일치합니다(===)
이 테스트 함수 세트는 예상값과 실제값이 깊이가 동일한지 확인하는 데 사용됩니다(===). 따라서 프로토타입은 다음과 같습니다. 객체의 값도 비교되며 값 유형도 비교 범위입니다. 이 세트에는 두 가지 테스트 기능도 있습니다.
4.1assert.deepStrictEqual(actual,expected[,message])
내부적으로 일치(===)를 사용하므로 객체의 프로토타입도 비교 범위에 포함됩니다
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
위 코드에서는 deepEqual( ) 어설션 테스트는 deepStrictEqual()을 사용하여 수행되었습니다. son1과 son2는 각각 두 개의 서로 다른 개체를 상속하지만 동일한 속성 값을 갖습니다. [deepEqual()은 객체의 프로토타입을 고려하지 않고, deepStrictEqual()은 프로토타입 객체를 비교 객체로 포함함]
4.2assert.strictEqual(actual, Expect[, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!