# assert

## assert 모듈이 지원하는 함수 목록 (node REPL 에서 실행, ctrl+D: exit)

```
$node
> require('assert')
{ [Function: ok]
  fail: [Function: fail],
  AssertionError: [Function: AssertionError],
  ok: [Circular],
  equal: [Function: equal],
  notEqual: [Function: notEqual],
  deepEqual: [Function: deepEqual],
  deepStrictEqual: [Function: deepStrictEqual],
  notDeepEqual: [Function: notDeepEqual],
  notDeepStrictEqual: [Function: notDeepStrictEqual],
  strictEqual: [Function: strictEqual],
  notStrictEqual: [Function: notStrictEqual],
  throws: [Function: throws],
  doesNotThrow: [Function: doesNotThrow],
  ifError: [Function: ifError] }
```

## 기본예제

```
assert.equal(1,2) // 1, 2는 다르므로 에러
AssertionError [ERR_ASSERTION]: 1 == 2

assert.ok(0) // 0은 Falsy 하므로 에러
AssertionError [ERR_ASSERTION]: 0 == true
```

## 심화예제

```
mkdir assert

cd assert

vi file.txt
[i] // 아래 text 입력
one
two
three
[esc -> :wq] // 저장 후 닫기

vi test.js
[i] // 아래 text 입력

  1 var assert = require('assert')
  2 var fs = require('fs')
  3
  4 assert.equal(1+2) // 오류 발생 예상 지점1
  5 countLines(function (err, n) {
  6   assert.ifError(err)
  7   assert.equal(n, 3) // 오류 발생 예상 지점2
  8 })
  9
 10 function countLines (cb) {
 11   fs.readFile('file.txt', 'utf8',  function (err, src) {
 12     if (err) cb(err)
 13     else cb(null, src.split('\n').length+100) // // 오류 발생 예상 지점3
 14   })
 15 }

[esc -> :wq] // 저장 후 닫기
```

## 심화예제 - 실행

(본 예제에서는 실패하는 코드를 의도적으로 숨겨놓음으로서 테스트 실패와 성공 시의 차이점을 알아본다.)

```
$node test.js
assert.js:42
  throw new errors.AssertionError({
  ^

AssertionError [ERR_ASSERTION]: 3 == undefined
```

### 첫 번째 오류 발생

```
4 assert.equal(1+2) // equal에 두 번째 파라미터가 지정되지 않아 발생.
4 assert.equal(1+2, 3) // 다음과 같이 수정 후 다시 실행
```

### 두 번째 오류 발생

```
assert.js:42
  throw new errors.AssertionError({
  ^

AssertionError [ERR_ASSERTION]: 104 == 3
```

### 오류 발생 지점

```
  5 countLines(function (err, n) {
  6   assert.ifError(err)
  7   assert.equal(n, 3) <-- 오류 발생 지점.
  8 })
  ..

  else cb(null, src.split('\n').length+100) // 의도적으로 100을 더하였기 때문. + 100을 없애고 다시 실행해보자.
```

### 세 번째 오류 발생

```
assert.js:42
  throw new errors.AssertionError({
  ^

AssertionError [ERR_ASSERTION]: 4 == 3
```

### 오류 발생 지점

```
$node
> require('fs').readFileSync('file.txt', 'utf8')
'one\ntwo\nthree\n'

// 문서 끝에 빈문자열을 제거한다.
13     else cb(null, src.trim().split('\n').length)
```

### 수정 후 다시 실행

테스트 성공. 하지만 아무런 메세지가 없다.

```
$node test.js
$$echo $? // exit code. 0일 경우 성공. 1일 경우 실패
0
```

## assert의 문제점

* exception 이 발생할 경우 실행을 멈춤.
*   테스트 블록이 실행되지 않을 경우에도 성공한 것처럼 보여짐.

    (13번째 줄 제거 후 성공으로 처리되는 문제)
