>웹 프론트엔드 >JS 튜토리얼 >node.js에서 Assert 사용 예 공유

node.js에서 Assert 사용 예 공유

小云云
小云云원래의
2018-01-29 17:27:471390검색

어설션은 일부 부울 표현식으로 표현되는 프로그래밍 용어로, 프로그래머는 프로그램의 특정 지점에서 표현식 값이 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 参数。

相关推荐:

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

위 내용은 node.js에서 Assert 사용 예 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.