programing

비동기 테스트 및 후크의 경우 "done()"이 호출되었는지 확인하고, 약속을 반환하는 경우 해결되었는지 확인합니다.

powerit 2023. 9. 25. 23:11
반응형

비동기 테스트 및 후크의 경우 "done()"이 호출되었는지 확인하고, 약속을 반환하는 경우 해결되었는지 확인합니다.

저는 테스트할 때 nodejs의 테스트가 있는데, done function의 오류가 선언되지 않았습니다.

오류: 2000ms의 시간 초과입니다.비동기 테스트 및 후크의 경우 "done()"이 호출되었는지 확인하고, 약속을 반환하는 경우 해결되었는지 확인합니다. 코드는,는인입니다.done();

    it('remove existing subdocument', (done) => {
    const Vic = new User({
      name: 'Vic',
      posts: [{ title: 'Leaning Nodejs' }]
    });

    vic.save()
      .then(() => User.findOne({ name: 'Vic' }))
      .then((user) => {
        const post = user.posts[0];
        post.remove();
        return user.save();
      })
      .then(() => User.findOne({ name: 'Vic' }))
      .then((user) => {
        assert(user.posts.length === 0);
        done();
      });
  });

나는 Mocha의 기본 타임아웃을 2초에서 10초로 증가시키는 것만으로 이것은 플래그를 추가함으로써 할 수 있는 추한 방법을 알고 있습니다.--timeout 10000트,즉,즉 등의

꾸러미의json

 "scripts": {
    "start": "SET NODE_ENV=dev && node server.js",
    "test": "mocha --timeout 10000"
  }

@MPAL의 댓글 링크가 도움이 되었다고 저도 같은 문제에 직면해 있었습니다.나는 그것에 대해 자세히 설명하고 있습니다.

오류/잘못된 주장이 있으면 약속 내부에 오류가 발생합니다.이것은 약속 거부로 이어집니다.한 번 거부하면 호출되지 않으며 mocha는 시간 초과를 보고합니다.다를 쓰면서 이 했습니다..catch다음 약속과 함께 차단하고 사슬로 묶습니다.

          it('resolves', (done) => {
            fooAsyncPromise(arg1, arg2).then((res, body) => {
                expect(res.statusCode).equal(incorrectValue);
                done();
            }).catch(done);
         });

위에세의 블로그에 언급된 다른 방법은 다음과 같습니다.

쇠사슬로 묶기then(done, done)그것은 약속의 결의와 거부를 모두 처리합니다.

         it('resolves', (done) => {
           resolvingPromise.then( (result) => {
             expect(result).to.equal('promise resolved');
           }).then(done, done);
         });

약속을 반환합니다.

        it('resolves', () => {
          return resolvingPromise.then( (result) => {
            expect(result).to.equal('promise resolved');
          });
        });

비동기/대기 사용:

        it('assertion success', async () => {
          const result = await resolvingPromise;
          expect(result).to.equal('promise resolved'); 
        });

특정 테스트에 시간 초과를 추가하면 기본 시간 초과(2초)를 증가/재지정할 수 있습니다.같은 문제가 있었지만 다음을 사용하여 해결할 수 있었습니다.

it('Test', (done) => { 
//your code  
done();
}).timeout(10000);

내 문제는 시간 초과 자체였기 때문에(시간 초과를 연장하는 것은 도움이 되지 않았습니다), 그래서 나의 해결책은

it("it should test methods",function(){
     this.timeout(0);
   });

당신이 보는 것처럼 당신은 필요하지 않습니다.done

위의 내용 중 아무 것도 도움이 되지 않으면 "done"을 제거하고 대신 비동기 함수()를 사용합니다.

it("Test Post Request", async function () {
    _code_
})

타임아웃을 늘리자는 것입니다.
다른 방법은 필요한 방법으로만 다음을 수행하는 것입니다.

 it('remove existing subdocument', function(done) {
         this.timeout(10000);
      //your code is here
      done();
    });

그것은 제가 문제를 해결하는데 도움이 됩니다.

저도 그 오류를 겪고 있었고, 몇 시간 동안 조사하고 디버깅한 끝에 근본 원인을 찾았습니다.

다음 테스트를 고려합니다.

const delay = require('delay')

describe('Test', function() {
    it('should resolve', async function(done) {
      await delay(1000)
    })
})

테스트를 실행하면 다음과 같은 오류가 발생합니다.

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

이제 완료된 인수가 제거되는 약간 다른 검정을 고려해 보겠습니다.

const delay = require('delay')

describe('Test', function() {
    it('should resolve', async function() {
      await delay(1000)
    })
})

이 테스트를 실행하면 합격입니다.

비동기 함수에 done 인수가 있으면 사용되지 않더라도 테스트가 중단되고 done()이 테스트의 마지막에 호출됩니다.

Mocha 버전 7.2.0 사용

package.json -일 - timeout 15000다를 하여 이 할 수 .
내가 아래에 쓰는 것처럼.

"scripts": {
  "start": "node server/server.js",
  "test": "export NODE_ENV=test || SET \"NODE_ENV=test\" && mocha --timeout 15000 server/**/*.test.js",
  "test-watch": "nodemon --exec 'npm test'"
}

이 오류는 mocha 때문에 발생합니다.

에서 할 수도 .before아니면beforEach.

describe('new loading express', function () {

  before(function () {
    this.timeout(20000); // 20 second timeout for setup
  });

});

Node6에서 Node13으로 이전 노드-모듈을 유지보수하고 돌아올 때 함께 하십시오.해결 방법은 간단합니다.

  • mocha.opts시험지 아래에 있습니다.
  • 은 입니다 --timeout 10000

에서 이 VS Code 를(를) timeout모카.src/test/suite/index.ts, 예를 들어 다음과 같습니다.

// Create the mocha test
const mocha = new Mocha({
    ui: 'tdd',
    color: true,
    timeout: 10000 // Your application ideal timeout here
});

저의 경우는 그것이 사용으로 인한 것입니다.sinon.useFakeTimers()

는 합니다.setTimeout()내 코드에 사용됩니다.모두 잘 작동하는 것을 제거한 후.

이 줄을 패키지에 추가합니다.json 파일을 사용하여 시간 초과를 늘립니다.

"scripts": { "test": "mocha --timeout 10000" },

저도 같은 오류가 있었는데, 사실 그때 합격하고 전화해서 그런 거예요.따라서 완료된 것을 제거하면 테스트에 통과됩니다.제가 전화를 했는데요.async

@Simon Boudrias here "Error: Resolution method is overspecific"?라는 답변이 효과적이었습니다.나는 단지 그 때를 놓친 것 뿐입니다.await Promise.resolve()는 처음에했습니다에 했습니다.after(async () => driver && driver.quit());모든 걸 치우고 제대로 존재했을 겁니다물론 설정하는 것을 잊지 마십시오..timeout(10000);테스트를 실행하기 위해 기본 2000 이상이 필요한 경우를 대비할 수 있도록 필요한 시간은 무엇이든 상관없습니다.

함께 작업할 수 있습니다.

  • 비동기 await,
  • 답례 약속 - 그럼,
  • 기능을 다한

모든 상황에서 시간 초과가 발생합니다.

  • 아래와 같이 명령 매개 변수로 지정할 수 있는 전역 시간 초과

  • 체인 메서드 또는 매개 변수로 주어진 펑키톤(각각의 [모든] 이전/이후)에 대한 타임아웃

    /usr/bin/node./node_modules/mocha/bin/_mocha -uddd --colors/home/cemt/cli-js/test/**/.spec.js

테스트 코드:

describe('NSSF', function () {

    var a = 0

    beforeAll(async function () {
        console.log(">>> 1. a: ", a);
        await new Promise((resolve, reject) => {
            var intt = setInterval(() => {
                console.log(">>> a: ", ++a);
                if (a == 10) {
                    clearInterval(intt)
                    resolve();
                }
            }, 800);
        });
    }, 12000);

    it('a should be set to 1', () => {
        console.log("-----1");
        return new Promise(resolve => {
            console.log("-----2");
            setTimeout(() => {
                resolve(1)
            }, 14000)
        }).then(a => {
            expect(a === 1);
        })
    }, 3000);
})

시간 초과 설정 안 함:

enter image description here

시간 초과 설정 시:

/usr/bin/node ./node_modules/mocha/bin/_mocha --slow 5000 -u bdd --timeout 10000 --colors /home/cemt/cli-js/test/**/*.spec.js

enter image description here

VS Code에서 Launch.json

enter image description here

모카 공식 페이지(모카 페이지)-> 모카 시작 시 다음 플래그 사용:

--timeout, -t Update in v6.0: --no-timeout은 inspect 플래그를 사용하여 Mocha를 호출할 때 암시됩니다.--timeout 0에 해당합니다. --timeout 999999999는 더 이상 필요하지 않습니다.

테스트 케이스 시간 초과를 지정합니다. 기본값은 2(2)초(2000밀리초)입니다.이 시간보다 오래 걸리는 테스트는 실패한 것으로 표시됩니다.

재정의하려면 시간 제한을 밀리초 단위로 전달하거나, 접미사가 s인 값(예: --timeout 2s 및 --timeout 2000)이 동일합니다.

시간 초과를 사용하지 않으려면 --no-timeout을 사용합니다.

참고: 동기(차단) 테스트도 시간 초과에 의해 구속되지만 코드가 차단을 중지할 때까지 완료되지 않습니다.무한 루프는 여전히 무한 루프일 것입니다!

저도 같은 문제가 있었습니다.저는.before내 암호대로고치기만 하면 모든 것이this.timeout(0);의 첫 줄로서.before기능 및 파일 전체에 비동기 await를 사용하고 제거합니다.done().

테스트 시간이 설정한 시간보다 길면 패키지 업데이트라는 오류가 계속 나타납니다.( --no-timeout 속성이 있는 두 번째 테스트를 추가하면 문제가 해결되었습니다.)와 함께 json 파일.

"scripts": {

"test": "cross-env PORT=8000 mocha --watch",
"test": "cross-env PORT=8000 mocha --watch --no-timeout"*,

할 필요 done()됩니다:. mocha timeout .

옵션 1: 입력package.json가:

  "mocha": {
    "timeout": "10000"
  }

옵션 2: 구성 파일 지정 및 추가timeout in it in it

, .mocharc.yml

:timeout: '2000' # same as "timeout: '2s'"

예제 참조: https://github.com/mochajs/mocha/blob/master/example/config/ .mocharc.yml

언급URL : https://stackoverflow.com/questions/44149096/for-async-tests-and-hooks-ensure-done-is-called-if-returning-a-promise-en

반응형