[node.js] 비동기 함수를 호출하는 동안 mocha 테스트에서 시간 초과 오류를 피하는 방법 : 시간 초과 2000ms 초과

내 노드 응용 프로그램에서 mocha를 사용하여 코드를 테스트하고 있습니다. mocha를 사용하여 많은 비동기 함수를 호출하는 동안 시간 초과 오류 ( Error: timeout of 2000ms exceeded.) 가 발생 합니다. 이 문제를 어떻게 해결할 수 있습니까?

var module = require('../lib/myModule');
var should = require('chai').should();

describe('Testing Module', function() {

    it('Save Data', function(done) {

        this.timeout(15000);

        var data = {
            a: 'aa',
            b: 'bb'
        };

        module.save(data, function(err, res) {
            should.not.exist(err);
            done();
        });

    });


    it('Get Data By Id', function(done) {

        var id = "28ca9";

        module.get(id, function(err, res) {

            console.log(res);
            should.not.exist(err);
            done();
        });

    });

});



답변

테스트를 실행할 때 시간 초과를 설정할 수 있습니다.

mocha --timeout 15000

또는 프로그래밍 방식으로 각 제품군 또는 각 테스트에 대한 시간 초과를 설정할 수 있습니다.

describe('...', function(){
  this.timeout(15000);

  it('...', function(done){
    this.timeout(15000);
    setTimeout(done, 15000);
  });
});

자세한 내용은 문서를 참조하십시오 .


답변

시간 초과를 늘리는 “솔루션”이 실제로 진행중인 작업을 모호하게합니다.

  1. 코드 및 / 또는 네트워크 호출 속도가 너무 느립니다 (사용자 경험을 좋게하려면 100ms 미만이어야 함)
  2. 단언 (테스트)이 실패하고 Mocha가 조치를 취하기 전에 오류가 발생했습니다.

일반적으로 Mocha가 콜백에서 어설 션 오류를받지 못하면 # 2가 발생합니다. 이것은 다른 코드가 스택을 더 이상 예외를 삼키기 때문에 발생합니다. 이를 처리하는 올바른 방법은 코드를 수정하고 오류를 삼키지 않는 것 입니다.

외부 코드가 오류를 삼킬 때

수정할 수없는 라이브러리 함수 인 경우 어설 션 오류를 잡아서 Mocha에 직접 전달해야합니다. 어설 션 콜백을 try / catch 블록에 래핑하고 예외를 done 처리기에 전달하면됩니다.

it('should not fail', function (done) { // Pass reference here!

  i_swallow_errors(function (err, result) {
    try { // boilerplate to be able to get the assert failures
      assert.ok(true);
      assert.equal(result, 'bar');
      done();
    } catch (error) {
      done(error);
    }
  });
});

이 상용구는 물론 테스트를 좀 더 즐겁게 해줄 몇 가지 유틸리티 기능으로 추출 할 수 있습니다.

it('should not fail', function (done) { // Pass reference here!
    i_swallow_errors(handleError(done, function (err, result) {
        assert.equal(result, 'bar');
    }));
});

// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
    try {
        fn();
        done();
    } catch (error) {
        done(error);
    }
}

네트워크 테스트 속도 향상

그 외에는 작동하는 네트워크에 의존하지 않고 테스트를 통과하기 위해 네트워크 호출에 테스트 스텁을 사용하기 시작하는 것에 대한 조언을 얻는 것이 좋습니다. Mocha, Chai 및 Sinon을 사용하면 테스트가 다음과 같이 보일 수 있습니다.

describe('api tests normally involving network calls', function() {

    beforeEach: function () {
        this.xhr = sinon.useFakeXMLHttpRequest();
        var requests = this.requests = [];

        this.xhr.onCreate = function (xhr) {
            requests.push(xhr);
        };
    },

    afterEach: function () {
        this.xhr.restore();
    }


    it("should fetch comments from server", function () {
        var callback = sinon.spy();
        myLib.getCommentsFor("/some/article", callback);
        assertEquals(1, this.requests.length);

        this.requests[0].respond(200, { "Content-Type": "application/json" },
                                 '[{ "id": 12, "comment": "Hey there" }]');
        expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
    });

});

자세한 내용은 Sinon의 nise문서 를 참조하십시오.


답변

조금 늦었지만 나중에 이것을 사용할 수 있습니다 … package.json의 스크립트를 다음과 같이 업데이트하여 테스트 시간 초과를 늘릴 수 있습니다.

"scripts": {
"test": "test --timeout 10000" //Adjust to a value you need
}

명령을 사용하여 테스트를 실행하십시오. test


답변

화살표 기능을 사용하는 경우 :

it('should do something', async () => {
  // do your testing
}).timeout(15000)


답변

나에게 문제는 실제로 화살표 기능을 제공 할 때 모카가 시간 초과를 놓치고 일관되게 동작하지 않는 describe 함수였습니다. (ES6 사용)

약속이 거부되지 않았기 때문에 describe 블록 내에서 실패한 다른 테스트에서 항상이 오류가 발생했습니다.

제대로 작동하지 않을 때의 모습입니다.

describe('test', () => {
 assert(...)
})

그리고 이것은 익명 함수를 사용하여 작동합니다

describe('test', function() {
 assert(...)
})

누군가에게 도움이되기를 바랍니다. (nodejs : 8.4.0, npm : 5.3.0, mocha : 3.3.0)


답변

내 문제는 응답을 다시 보내지 않아서 중단되었습니다. express를 사용하는 경우 res.send (data), res.json (data) 또는 사용하려는 API 메소드가 테스트중인 경로에 대해 실행되는지 확인하십시오.


답변

테스트 사례에 사용 된 약속을 해결 / 거부해야합니다.