1. console.assert πŸ‘©β€πŸ’»

JavaScript λ₯Ό μ‚¬μš©ν•˜λ“ , TypeScript λ₯Ό μ‚¬μš©ν•˜λ“  ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ Jest, Vitest와 같은 μ„œλ“œνŒŒν‹° 라이브러리λ₯Ό μ„€μΉ˜ν•˜κ³€ ν–ˆλ‹€. λ¬Έμ œλŠ” μ„œλ“œνŒŒν‹°μ΄λ‹€λ³΄λ‹ˆ ν”„λ‘œμ νŠΈ μ„€μ •μ΄λ‚˜ λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬μ— 쒅속성을 κ°€μ Έ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 돌렀보기 μœ„ν•΄ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 잘 λŒμ•„κ°€λŠ”μ§€ ν…ŒμŠ€νŠΈλ₯Ό ν•΄μ•Όν•˜λŠ” μ•„μ΄λŸ¬λ‹ˆν•œ 상황을 κ²ͺ은 적이 μžˆλ‹€.

μ‹€μ œ ν”„λ‘œμ νŠΈλ„ μ•„λ‹Œλ° 토이 ν”„λ‘œμ νŠΈμ—μ„œ 일뢀 ν•¨μˆ˜λ₯Ό κ°€λ³κ²Œ ν…ŒμŠ€νŠΈ ν•΄λ³΄κ³ μž ν•  λ•Œ 이런 상황이 νŽΌμ³μ§€λ©΄ 배보닀 배꼽이 더 μ»€μ§€λŠ” 그런 상황에 짜증이 λ‚˜κ³€ ν•œλ‹€.

κ·Έλž˜μ„œ 문득 κΆκΈˆν–ˆλ‹€.

Java λ₯Ό λΉ„λ‘―ν•œ λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•  λ•Œ 기본적으둜 xUnit이 μžˆμ–΄ λ³„λ„μ˜ μ„€μΉ˜ 없이도 ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•˜λ‹€. μ„œλ²„λ₯Ό κ°œλ°œν•˜λ©° νšŒμ‚¬ μ½”λ“œμ— ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ λ„μž…μ„ ν–ˆμ„ λ•Œ μ—­μ‹œ 별닀λ₯Έ μ„€μΉ˜ 없이 λ°”λ‘œ JUnit을 μ‚¬μš©ν–ˆλ‹€. 심지어 λ­”κ°€ μ•ˆλ˜λŠ”κ²Œ λ„ˆλ¬΄λ„ λ§Žλ‹€λŠ” xCode ν™˜κ²½μ—μ„œλ„ Swift 와 Objective-C λ₯Ό ν…ŒμŠ€νŠΈ ν•˜κΈ° μœ„ν•œ XCTest`κ°€ 기본으둜 ν¬ν•¨λ˜μ–΄ μžˆμ—ˆλ‹€.

λ¬Όλ‘ , console.assertλ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ 이것은 μ•„λž˜ μ½”λ“œλ₯Ό 톡해 확인할 수 μžˆλ“―μ΄ ν…ŒμŠ€νŠΈ μ½”λ“œμš©μœΌλ‘œ μ ν•©ν•˜μ§€ μ•Šλ‹€.

const isEven = (num) => num % 2 === 0

const test = () => {
  const num = 3
  
  const result = isEven(num)
  
  console.assert(result, `The number ${num} is not even.`)
}

test()

console.assert(assertion:obj:[...obj]?:), console.assert(assertion:msg:[...msg]?:)λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 데 μ‚¬μš©ν•˜κΈ°μ— μ ν•©ν•˜μ§€ μ•Šλ‹€.


2. Node β€˜assert’ πŸ‘©β€πŸ’»

항상 λΈŒλΌμš°μ € ν™˜κ²½μ„ λ¨Όμ € μƒκ°ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ‹€λ³΄λ‹ˆ λΈŒλΌμš°μ €μ—μ„  μ œκ³΅λ˜μ§€ μ•Šμ§€λ§Œ Node μ—λŠ” assertλ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. λ‹Ήμ—°νžˆ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„  μ œκ³΅λ˜μ§€ μ•ŠλŠ” API μ˜€λ˜ 것이닀. ν•˜μ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈ μ—­μ‹œ webpackμ΄λ‚˜ vitest, parcel 와 같은 λ²ˆλ“€λŸ¬λ₯Ό μ‚¬μš©ν•˜λ©΄ 배포 μ „ Node 의 도움을 λ°›μ•„ 컴파일 되기 λ•Œλ¬Έμ— assertλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

λ‹€λ§Œ, 이 assertκ°€ μ‹œκ°μ μœΌλ‘œλ„ 성곡과 μ‹€νŒ¨ μ—¬λΆ€κ°€ 잘 κ΅¬λΆ„λ˜μ§€ μ•ŠμœΌλ©° Jestλ‚˜ Vitest와 같은 λΌμ΄λΈŒλŸ¬λ¦¬λ“€κ³Ό μ‚¬μš© 방법이 κ½€ λ‹€λ₯΄λ‹€λŠ” 점이닀.

λ”°λΌμ„œ 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Jest μŠ€νƒ€μΌλ‘œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ„λ‘ 기본적인 ν…ŒμŠ€νŠΈ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄λ‘λ©΄ μ„œλ“œνŒŒν‹° 라이브러리λ₯Ό μ„€μΉ˜ν•˜κ³ , λ²„μ „μ΄λ‚˜ λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ 쒅속성을 체크할 ν•„μš” 없이 토이 ν”„λ‘œμ νŠΈ 같은 κ²ƒμ—μ„œ μ‰½κ²Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

import assert from 'assert';

export const test = (description, callback) => {
  try {
    callback();
    console.log('Test %cpassed%c:', 'color: green', '', description);
  } catch (error) {
    console.error(
      'Test %cfailed%c:',
      'color: red',
      '',
      description,
      '-',
      error.message,
      '\nActual:',
      error.actual,
      '\nExpected:',
      error.expected
    );
  }
};

export const expect = (value) => {
  const toBe = (expected) => assert.strictEqual(value, expected);
  const toEqual = (expected) => assert.deepStrictEqual(value, expected);
  const not = {
    toBe: (expected) => assert.notStrictEqual(value, expected),
    toEqual: (expected) => assert.notDeepStrictEqual(value, expected),
  };

  return { toBe, toEqual, not };
};

toBeλŠ” Primitive νƒ€μž…μ˜ κ°’κ³Ό, Reference νƒ€μž…μ˜ 값에 ν•΄λ‹Ήν•˜λŠ” 포인터(shallow)κ°€ 같은지λ₯Ό λΉ„κ΅ν•œλ‹€.
toEqual은 reference νƒ€μž…μ˜ μ‹€μ œ κ°’(deep)이 같은지 λΉ„κ΅ν•œλ‹€.

λ”°λΌμ„œ Primitive νƒ€μž…μ€ toBeλ₯Ό μ‚¬μš©ν•˜κ³ , Reference νƒ€μž…μ€ 포인터λ₯Ό 비ꡐ할 λ•ŒλŠ” toBeλ₯Ό μ‚¬μš©ν•˜κ³  값을 비ꡐ할 λ•ŒλŠ” toEqual을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.


이제 μœ„μ—μ„œ λ§Œλ“  ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄μž.


test('Two numbers are equal.', () => {
  expect(1 + 2).toBe(3);
});

test('Two strings are equal.', () => {
  expect('hello').toBe('hello');
});

test('Two numbers are not equal.', () => {
  expect(1 + 2).not.toBe(4);
});

test('Two different objects have same values(deep value equal)', () => {
  const obj1 = { a: 1, b: 2 };
  const obj2 = { a: 1, b: 2 };
  expect(obj1).toEqual(obj2);
});

test('Two different objects have different pointer address.', () => {
  const obj1 = { a: 1, b: 2 };
  const obj2 = { a: 1, b: 2 };
  expect(obj1).not.toBe(obj2);
});

test('Two different objects have different values(deep value not equal).', () => {
  const obj1 = { a: 1, b: 2 };
  const obj2 = { a: 1, b: 2, c: 4 };
  expect(obj1).not.toEqual(obj2);
});

test('Two arrays are equal.', () => {
  const arr1 = [1, 2, 3];
  const arr2 = [1, 2, 3];
  expect(arr1).toEqual(arr2);
});

test('This test will be failed.', () => {
  expect(23).toBe(25);
});

test result