Jak zmienić limit czasu w specyfikacji asynchronicznej węzła jasmine


90

Jak mogę sprawić, aby ten test zakończył się pomyślnie bez uciekania się do uruchomień / oczekujących bloków?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});

Odpowiedzi:


105

Możesz (teraz) ustawić to bezpośrednio w specyfikacji, zgodnie z dokumentacją Jasmine .

describe("long asynchronous specs", function() {

    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

    it("takes a long time", function(done) {
        setTimeout(function() {
            done();
        }, 9000);
    });

    afterEach(function() {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });
});

Tak, zmiana jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;wartości załatwiła mi sprawę na zupełnie nowej konfiguracji zbudowanej od podstaw przy użyciu Jasmine + Jest. Działa zgodnie z oczekiwaniami.
Ignacio Segura

Zgadzam się, @willydee, miałem problemy z uruchomieniem testów w Cloudinary i ten mały fragment przyszedł mi na ratunek.
Dev Yego

1
Warto zauważyć, że być może musi to nastąpić przed it. doneWygląda na to , że do czasu rozpoczęcia testu podłączyłeś się już do tego, co DEFAULT_TIMEOUT_INTERVALbyło przed itrozpoczęciem.
ruffin


43

Aby ustawić globalny limit czasu Jasmine-Node, wykonaj następujące czynności:

jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds

Podziękowania dla programisty Gabe'a Hicksa za znalezienie części .getEnv () poprzez debugowanie pomimo błędnych informacji w dokumencie README, który twierdzi, że zostało to zrobione przez ustawienie jasmine.DEFAULT_TIMEOUT_INTERVAL.

Jeśli chcesz ustawić niestandardowy limit czasu tylko dla jednej it (), możesz spróbować przekazać limit czasu (milisekundy) jako trzeci argument (po instrukcji string i funkcji). Oto przykład takiego rozwiązania , ale nie jestem pewien, co by się stało, gdyby niestandardowy limit czasu był dłuższy niż domyślny Jasmine. Spodziewam się, że to się nie uda.


28
Aktualizacja dla każdego, kto natknie się na tę odpowiedź w 2014 roku: dla Jasmine 2 ustawienie jasmine.DEFAULT_TIMEOUT_INTERVAL działa.
Simon Groenewolt,

2
U mnie działa na zupełnie nowej konfiguracji z Jest + Jasmine. Właśnie dodałem jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;globalny plik konfiguracyjny, którego używam do wszystkich testów i działa zgodnie z oczekiwaniami.
Ignacio Segura,

23

Wygląda na to, że możesz teraz dodać go jako ostatni argument itfunkcji:

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});

11

W Angular umieść to poza blokiem opisu:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Dotyczy to wszystkich testów w pliku .spec.ts


3

Umieść to po describestwierdzeniu:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

2

Dodawanie: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;na pliku pomocniczym zadziałało dla mnie.


1

Dlaczego nie szpiegując setTimeout()?

Coś jak:

var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
    expect(timeout).toEqual(2500);
    func();
});

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();

1
Dzięki. To są testy integracji, które node.js wywołuje do usługi zewnętrznej, która często działa wolno.
Brian Low

to jest genialne, umożliwia przetestowanie limitu czasu bez czekania testu na faktyczny limit czasu
Guillaume,

w ten sposób nie ćwiczymy upływu czasu i wywołujemy fn od razu, podczas gdy oryginał nigdy go nie wywołuje przed następnym cyklem.
André Werlang

0

W moim przypadku miałem wiele przypadków testowych i podczas korzystania z wyżej wymienionego rozwiązania korzystałem z:

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

DEFAULT_TIMEOUT_INTERVAL nie został zaktualizowany w pierwszym przypadku testowym, więc musiałem dodać to:

  beforeAll(() => {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  })

do mojego kodu, aby pomyślnie przeprowadzić wszystkie testy.


-17

Zmień j $ .DEFAULT_TIMEOUT_INTERVAL na 10000 w następującym pliku: npm \ node_modules \ jasmine-core \ lib \ jasmine-core


Nie jest to owocne w scenariuszach, w których biblioteki są instalowane za każdym razem, gdy uruchamiany jest test. Np .: - uruchamianie CI w chmurze.
domino_katrino
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.