Jak zwiększyć limit czasu dla pojedynczego przypadku testowego u mokki


405

Przesyłam żądanie sieciowe w przypadku testowym, ale czasami trwa to dłużej niż 2 sekundy (domyślny limit czasu).

Jak zwiększyć limit czasu dla pojedynczego przypadku testowego?

Odpowiedzi:


669

Proszę bardzo: http://mochajs.org/#test-level

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

Do funkcji strzałek używaj:

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

23
limit czasu jest wyrażony w milisekundach i wynosi domyślnie 2000.
Ethan Mick

47
Używałem funkcji strzałek es6 i musiałem wrócić do starych definicji „funkcji”, aby „to” zadziałało.
Aruna Herath,

1
Działa również w przypadku haków, takich jakbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH Powodem funkcja strzałka nie działa z powodu leksykalny to
Tanner Faulkner

11
czy istnieje sposób, aby działał z funkcją strzałki? edytuj: dodaj .timeout(500)na koniecit(...).timeout(500)
chovy

136

Jeśli chcesz używać funkcji strzałek es6, możesz dodać a .timeout(ms)na końcu swojej itdefinicji:

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

Przynajmniej działa to w maszynopisie.


3
To działa, ale .timeoutnie jest wliczone w typowania DefinitelyTyped dla mocha: i.imgur.com/jQbWCn1.png - Używanie this.timeout(2000)lub this.slow(500)z regularnym stare utwory funkcyjne i kompiluje bez błędów
Leon Adler

3
Niestety, to działa tylko it, ale nie działa describe.
Robert

3
czy można to zrobić dla describe()lub context()?
chovy

1
@LeonAdler .timeoutjest obecnie zawarte w Mocha typowania DefinitelyTyped pod adresem: Mocha.IRunnable. Jeśli jednak używasz Webstorm IDE do uruchamiania tych testów, uwaga: z jakiegokolwiek powodu wtyczka integracji Mocha WebStorm nadal nie rozpoznaje testów Mocha z .timeout()dołączonymi (co oznacza, że ​​obok nich nie pojawia się przycisk „uruchom”), i dlatego zalecam unikanie funkcji strzałek, aby umożliwić korzystanie z nich this.timeout().
Jamie Birch,

To jest doskonałe. W przypadku funkcji asynchronicznej zwracającej obietnicę możesz pominąć gotowe ().
billoverton

72

(odkąd dzisiaj na to wpadłem)

Zachowaj ostrożność podczas korzystania ze składni Fat Arrow ES2015:

To się nie powiedzie:

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

EDYCJA: Dlaczego się nie udaje:

Jak wspomniano w komentarzach @atoth, funkcje strzałek grubych nie mają tego wiązania. W związku z tym, że nie jest możliwe, by to funkcjonować wiązać się to z zwrotnego i zapewnić Timeout funkcję.

Konkluzja : Nie używaj funkcji strzałek w przypadku funkcji, które wymagają dłuższego czasu oczekiwania.


2
Ponieważ funkcje strzałek wcale tego nie mają. Przeczytaj więcej tutaj: blog.getify.com/arrow-this
atoth

2
Tak, ale wyjaśniłem to w odpowiedzi. Zobacz mój komentarz. // wewnątrz kodu. Prawdopodobnie powinienem to wyjaśnić poza blokiem kodu, aby było jaśniej. to istnieje, ale pochodzi z zewnętrznego zakresu.
chriskelly,

1
Moje wyjaśnienie jest dokładniejsze. thisFunkcje strzałek nie są wiążące - nie ten sam sposób sugerowałby, że mają jakieś, po prostu inne. Mają tylko zakresy leksykalne. Nie możesz powiązać nieistniejącego tego. Dlatego .bind, .callitp nie praca z nim.
atoth

1
To prawda - a twoje prawo jest dokładniejsze. Dzięki
chriskelly,

1
Powiedziałbym, że dlatego powinieneś używać grubych strzał tylko wtedy, gdy ich potrzebujesz, ale straciłem świadomość tego, co thisjest.
xdumaine

42

Jeśli używasz w NodeJS, możesz ustawić limit czasu w package.json

"test": "mocha --timeout 10000"

wtedy możesz uruchomić używając npm:

npm test

1
To nie dotyczy wszystkich przypadków testowych, nie jednego przypadku testowego
garryp

Zgodziłem się, że to nie odpowiada na pytanie, ale było wystarczające dla mojego przypadku użycia, gdzie nie obchodziło mnie, czy wzrosło dla wszystkich testów. Myślę, że wielu ludziom, którzy tu trafią, może nie obchodzić, czy to na jeden test, czy na wszystkie, więc doceniam tę odpowiedź.
billoverton

22

Z linii poleceń:

mocha -t 100000 test.js

14
Zwiększa to limit czasu dla wszystkich przypadków testowych zamiast „dla konkretnego przypadku testowego”, jak pyta pytanie.
Louis

16

Możesz także pomyśleć o przyjęciu innego podejścia i zastąpieniu wywołania zasobu sieciowego obiektem pośredniczącym lub próbnym. Korzystając z Sinon , możesz oddzielić aplikację od usługi sieciowej, koncentrując swoje wysiłki na rozwoju.


7
Nie jest to całkowicie nieistotne; często sensowne jest wyciszenie odpowiedzi sieciowej, aby nie polegać na tym, że komputer działa lub nie zwraca poprawnej odpowiedzi. Jeśli jednak testujesz samą odpowiedź, to tak, nadal musisz to zrobić.
aendrew

2
Używam sinon / mocha do zbudowania testów integracji, więc istotne są wyższe limity czasu.
jcollum

9

Do nawigacji testowej w 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);
            });
    });
});

W tym przykładzie czas testu wynosi 4000 (4s).

Uwaga: setTimeout(done, 3500)jest niewielka, ponieważ donejest wywoływana w czasie testu, ale clearTimeout(timeOut)unika się jej przez cały ten czas.


2

To zadziałało dla mnie! Nie mogłem znaleźć niczego, co by działało wcześniej ()

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 () działał idealnie!
acidjazz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.