Mocha와 Should.js를 이용해 테스트 코드를 작성하던 중, 콜백 함수 내에선 assert 기능이 정상적으로 작동하지 않는 것을 발견했다. 처음엔 Should.js 자체의 문제인 줄 알고 assert 라이브러리로 바꿔서 시도했지만 똑같은 현상이 발생했다. 아래와 같이 명백히 오류가 나야 하는 부분도 문제 없이 통과가 되었다.

 

const tempAndHum = require('tempAndHum')

it('현재 온습도 출력 테스트', () => {
    tempAndHum.getNowTah((data) => {
        (0).should.be.equal(1)
    })
})

 

 찾아본 결과, mocha에서 비동기 함수 내에서 테스트를 진행할 때는 done을 이용하여, mocha가 해당 테스트 함수가 모두 실행될 때까지 기다리도록 해야 한다. 그래서 다음과 같이 바꿨다. 여기까지는 공식 문서에도 설명이 잘 되어 있는 부분이다.

it('현재 온습도 출력 테스트', (done) => {
    tempAndHum.getNowTah((data) => {
        (0).should.be.equal(1)
        done()
    })
})

 

 

 이렇게 하고 테스트를 진행하니, 이제는 다음과 같이 엉뚱한 부분에서 에러가 떴다.

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

   

  분명 나는 done()을 넣어 놨는데, 테스트 모듈에선 못 찾고 있었다. 그래서 다시 찾아본 결과, (0).should.be.equal(1)의 assert 문에서 이미 Error가 던져져서 코드 실행이 중단되고, 따라서 done()까지 코드가 가지 못하고 있는 상태였다. Promise를 이용한 비동기 함수라면 .catch로 해결하면 될 것이고, 콜백 함수를 이용한 비동기 문일 경우 다음과 같이 try ~ catch 문으로 테스트 함수를 감싸면 된다. 최종적으로 아래와 같다.

 

it('현재 온습도 출력 테스트', (done) => {
    tempAndHum.getNowTah((data) => { // 테스트를 원하는 함수
        try {
            // 원하는 테스트 코드 입력
            done()
        }
        catch (err){
            done(err)
        }
    })
})

 

 

 

+ Recent posts