assert.rejects() 함수란?
Node.js의 assert 모듈은 함수 검증(assertion)에 필요한 다양한 기능을 제공합니다. 그중 assert.rejects() 함수는 전달된 비동기 함수(asyncFn)가 반환하는 프로미스가 거부(reject)되는지 확인하는 역할을 합니다.
만약 asyncFn이 함수라면 즉시 호출되고, 해당 함수가 반환한 프로미스가 완료될 때까지 대기합니다. 이후 그 프로미스가 거부되었는지 검사하며, 거부되지 않으면 AssertionError가 발생합니다.
문법(Syntax)
assert.rejects(asyncFn, [error], [message])
매개변수(Parameters)
asyncFn – 동기적으로 오류를 던질 수 있는 비동기 함수입니다. 프로미스 객체를 직접 전달할 수도 있습니다.
error – (선택 사항) 클래스(Class), 정규표현식(RegExp), 검증 함수 또는 각 속성이 테스트되는 객체를 지정할 수 있습니다.
message – (선택 사항) 함수 실행 시 함께 출력되는 사용자 정의 메시지입니다.
Assert 모듈 설치하기
npm install assert
assert 모듈은 Node.js에 내장된 모듈이므로 별도 설치 없이 바로 사용할 수 있습니다. 최신 버전을 확인하려면 아래 명령어를 실행하세요.
npm version assert
모듈 불러오기
const assert = require("assert").strict;예제 1: 실패 케이스
아래 코드를 assertRejects.js 파일로 저장한 뒤, 다음 명령어로 실행해 보세요.
node assertRejects.js
assertRejects.js
// 모듈 불러오기
const assert = require('assert').strict;
(async () => {
assert.strictEqual(21, 20)
await assert.rejects(
async () => {
throw new TypeError('Value passed is Incorrect !');
},
(err) => {
assert.strictEqual(err.name, 'TypeError');
assert.strictEqual(err.message, 'Incorrect value');
return true;
}
).then(() => {
console.log("This is a reject demo")
});
})();
출력 결과
C:\home\node>> node assertRejects.js
(node:259525) UnhandledPromiseRejectionWarning: AssertionError
[ERR_ASSERTION]: Input A expected to strictly equal input B:
+ expected - actual
- 21
+ 20
at /home/node/test/assert.js:5:9
at Object. (/home/node/test/assert.js:18:3)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
(node:259525) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:259525) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
위 예제에서 오류가 발생한 이유는 assert.strictEqual(21, 20) 구문 때문입니다. 21과 20은 같지 않으므로 이 검증이 먼저 실패하면서 AssertionError가 발생하고, 처리되지 않은 프로미스 거부(Unhandled Promise Rejection) 경고가 출력됩니다.
예제 2: 성공 케이스
이번에는 올바른 값을 넣어 정상적으로 동작하는 경우를 살펴보겠습니다.
// 모듈 불러오기
const assert = require('assert').strict;
(async () => {
assert.strictEqual(21, 21)
await assert.rejects(
async () => {
throw new TypeError('Value passed is Incorrect !');
},
(err) => {
assert.strictEqual(err.name, 'TypeError');
assert.strictEqual(err.message, 'Value passed is Incorrect !');
return true;
}
).then(() => {
console.log("This is a reject demo success")
});
})();
출력 결과
C:\home\node>> node assertRejects.js
This is a reject demo success
두 값이 일치하여 첫 번째 검증을 통과했고, 비동기 함수에서 던진 TypeError가 검증 함수의 조건(에러 이름과 메시지)과 정확히 일치하므로 assert.rejects()가 정상적으로 통과되었습니다.
정리
assert.rejects()는 비동기 코드에서 발생하는 에러를 테스트할 때 필수적인 함수입니다. 주요 포인트를 정리하면 다음과 같습니다.
비동기 함수나 프로미스가 거부(reject)되는지 검증합니다.
error 매개변수로 클래스, 정규표현식, 검증 함수, 객체 등 다양한 방식으로 거부 조건을 지정할 수 있습니다.
프로미스가 거부되지 않으면 AssertionError가 발생하므로, 반드시 await와 함께 사용하는 것이 좋습니다.