programing

비동기 함수를 호출하는 동안 Mocha 테스트에서 시간 초과를 방지하는 방법 오류: 시간 초과가 2000ms를 초과했습니다.

iphone6s 2023. 5. 22. 20:49
반응형

비동기 함수를 호출하는 동안 Mocha 테스트에서 시간 초과를 방지하는 방법 오류: 시간 초과가 2000ms를 초과했습니다.

노드 애플리케이션에서 모카를 사용하여 코드를 테스트하고 있습니다.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. 주장(테스트)이 실패하고 모카가 오류에 대해 조치를 취하기 전에 무언가가 오류를 삼키고 있습니다.

당신은 보통 모카가 콜백으로부터 어설션 오류를 수신하지 않을 때 #2를 접합니다.이 문제는 다른 코드가 예외를 스택 위로 더 많이 삼키기 때문에 발생합니다.문제를 해결하는 올바른 방법은 코드를 수정하고 오류를 삼키지 않는 것이 좋습니다.

외부 코드가 오류를 삼킬 때

당신이 수정할 수 없는 라이브러리 함수인 경우, 당신은 주장 오류를 파악하여 Moca에 직접 전달해야 합니다.이 작업은 어설션 콜백을 시도/캐치 블록으로 감싸고 완료된 처리기에 예외를 전달함으로써 수행됩니다.

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);
    }
}

네트워크 테스트 속도 향상

그 외에는 네트워크 호출에 테스트 스텁을 사용하여 작동하는 네트워크에 의존하지 않고 테스트를 통과하는 방법에 대한 조언을 얻으실 것을 제안합니다.모카, 차이, 신을 시험에 사용하면 이렇게 보일 수 있습니다.

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;
    });

});

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

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

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

조금 늦었지만 누군가는 나중에 이걸 사용할 수 있습니다.패키지의 스크립트를 업데이트하여 테스트 시간 초과를 늘릴 수 있습니다.다음을 포함하는 json:

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

을 합니다.test

저에게 문제는 실제로 설명 함수였습니다. 화살표 함수가 제공되면 모카가 시간 초과를 놓치고 일관성 없이 동작합니다. (ES6 사용)

어떤 약속도 거부되지 않았기 때문에 설명 블록 내에서 실패하고 있는 다른 테스트에 대해 항상 이 오류가 발생했습니다.

제대로 작동하지 않을 때의 모습은 다음과 같습니다.

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 메서드가 실행되는지 확인합니다.

테스트 사례에 사용된 약속을 해결/거부해야 합니다. 스파이나 스텁이 해결/거부하는지 확인합니다.

언급URL : https://stackoverflow.com/questions/16607039/in-mocha-testing-while-calling-asynchronous-function-how-to-avoid-the-timeout-er

반응형