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


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.