모카에서 단일 테스트 케이스의 시간 초과를 늘리는 방법


405

테스트 사례에서 네트워크 요청을 제출하고 있지만 때로는 2 초 이상 (기본 시간 초과)이 걸립니다.

단일 테스트 케이스의 시간 초과를 늘리려면 어떻게합니까?

답변:


669

여기 있습니다 : http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

화살표 기능의 경우 다음과 같이 사용하십시오.

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
시간 초과는 밀리 초 단위이며 기본값은 2000입니다.
— Ethan Mick

47
es6 화살표 함수를 사용하고 있었고 "this"가 작동하려면 이전의 "function"정의로 돌아 가야했습니다.
— Aruna Herath

1
또한 같은 후크 작동before(function(done){this.timeout(5 * 1000);...});
— JP

2
@AH 화살표 기능이 작동하지 않는 이유는 어휘
— Tanner Faulkner

11
화살표 기능으로 작동시키는 방법이 있습니까? 편집 :의 .timeout(500)끝 부분에 추가it(...).timeout(500)
— chovy

136

es6 화살표 기능을 사용하려면 정의 .timeout(ms)끝에 a 를 추가 할 수 있습니다 it.

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

적어도 이것은 Typescript에서 작동합니다.


3
이것은 작동하지만 .timeoutmocha의 DefinitelyTyped 타이핑에는 포함되어 있지 않습니다 : i.imgur.com/jQbWCn1.png- 기존 함수를 사용 this.timeout(2000)하거나 this.slow(500)오류없이 컴파일
— Leon Adler

3
슬프게도이 기능은 작동하지만 작동 it하지 않습니다 describe.
— robrich

3
describe()또는 을 위해 이것을 할 수있는 방법이 context()있습니까?
— chovy 2012 년

1
@LeonAdler .timeout는 이제 DefinitelyTyped의 Mocha 타이핑에 포함되어 있습니다 : Mocha.IRunnable. 그러나 이러한 테스트를 실행하기 위해 Webstorm IDE를 사용하는 경우주의해야합니다. 어떤 이유로 든 WebStorm의 Mocha 통합 플러그인은 여전히 .timeout()추가 된 Mocha 테스트를 인식하지 못합니다 (옆에 '실행'버튼이 나타나지 않음). 따라서 this.timeout()대신 화살표 기능을 사용하지 않도록 권장 합니다.
— Jamie Birch

이것은 완벽 해요. 약속을 반환하는 비동기 함수의 경우 done ()을 생략 할 수 있습니다.
— 청구서

72

(내가 오늘 이것에 부딪친 이후)

ES2015 지방 화살표 구문을 사용할 때주의하십시오.

이것은 실패합니다 :

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

편집 : 왜 실패합니까 :

주석에서 @atoth가 언급했듯이, 팻 화살표 기능에는 자체 바인딩 이 없습니다 . 따라서 it 함수 가이 콜백 에 바인드 하고 시간 종료 함수를 제공 할 수 없습니다.

결론 : 시간 초과가 증가해야하는 기능에는 화살표 기능을 사용하지 마십시오.


2
화살표 기능에는이 기능이 전혀 없기 때문입니다. 자세한 내용은 다음을 참조하십시오 : blog.getify.com/arrow-this
— atoth

2
네,하지만 대답에서 이것을 설명했습니다. 내 의견을 참조하십시오. // 코드 내부 코드 블록 외부에서 더 명확하게 설명해야 할 것입니다. 이것은 존재하지만 외부 범위에서 나옵니다.
— chriskelly

1
내 설명이 더 정확합니다. this화살표 함수 에는 바인딩 이 없습니다 . 같은 방식으로 다른 기능을 제안하는 것과 같은 방식은 아닙니다. 어휘 범위 만 있습니다. 존재하지 않는 바인딩 할 수 없습니다. 이유 즉 .bind, .call등이 작동하지 않습니다.
— atoth

1
맞습니다-당신의 권리가 더 정확합니다. 감사합니다
— chriskelly

1
나는 이것이 필요할 때만 뚱뚱한 화살을 사용해야하는 이유라고 말하지만, 나는 무엇인지 추적하지 못했습니다 this.
— xdumaine

42

NodeJS에서 사용하는 경우 package.json에서 시간 초과를 설정할 수 있습니다.

"test": "mocha --timeout 10000"

다음과 같이 npm을 사용하여 실행할 수 있습니다.

npm test

1
즉, 모든 테스트 케이스에 대한의 아닌 하나의 테스트 케이스
— garryp

이것이 질문에 대한 답변은 아니지만 모든 테스트에서 증가했는지 걱정하지 않는 유스 케이스에는 충분했습니다. 나는 여기에있는 많은 사람들이 하나의 테스트에 대한 것인지 아니면 전혀 상관하지 않을 것이라고 생각합니다.
— 청구서

22

명령 행에서 :

mocha -t 100000 test.js

14
이렇게 하면 질문과 같이 "특정 테스트 사례"가 아닌 모든 테스트 사례 의 시간 초과 가 증가합니다 .
— Louis

16

다른 접근 방식을 사용하고 네트워크 리소스에 대한 호출을 스텁 또는 모의 객체로 대체하는 방법을 생각할 수도 있습니다. Sinon을 사용하면 개발 노력에 집중하여 앱을 네트워크 서비스에서 분리 할 수 ​​있습니다.


7
그것은 아니라 전적으로 무관; 네트워크 응답을 스텁하여 해당 시스템이 작동 중이거나 올바른 응답을 반환하지 않는 경우가 종종 있습니다. 그러나 응답 자체를 테스트하는 경우 여전히 그래야합니다.
— 14

2
sinon / mocha를 사용하여 일부 통합 테스트를 작성하고 있으므로 시간 초과가 높을수록 관련이 있습니다.
— jcollum

9

테스트 navegation의 경우 Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

이 예에서 테스트 시간은 4000 (4 초)입니다.

참고 : 테스트 시간 내에 호출 된 setTimeout(done, 3500)것보다 부수적 done이지만 clearTimeout(timeOut)항상 사용되는 것을 피하십시오.


2

이것은 나를 위해 일했다! before ()와 함께 작동하도록 할 항목을 찾을 수 없습니다

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.timeout ()이 완벽하게 작동했습니다!
— 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.