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();
     });
});
Brian Low
źródło

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;
    });
});
Francisco
źródło
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
79

Wysłano żądanie ściągnięcia dla tej funkcji ( https://github.com/mhevery/jasmine-node/pull/142 )

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

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

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

     done();
  });

}, 5000); // set timeout to 5 seconds
Brian Low
źródło
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.

Colin May
źródło
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
});
d -_- b
źródło
11

W Angular umieść to poza blokiem opisu:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

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

danday74
źródło
3

Umieść to po describestwierdzeniu:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
Michał Kuliński
źródło
2

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

Ivan Rangel
źródło
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();
ggozad
źródło
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.

Andreas Foteas
źródło
-17

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

sharaj rewoo
źródło
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