2015-03-05 18 views
7

Nie chcę czytać kodu godzin, aby znaleźć odpowiednią część, ale jestem ciekawy jak jaśmin realizuje swój zegar. Ciekawe jest to, że może przetestować kod asynchroniczny z kodem testowania synchronizacji. AFAIK, z obecnym plikiem node.js, który obsługuje ES5, nie jest to możliwe (funkcje asynchroniczne są zdefiniowane w ES7). Czy analizuje kod js z czymś podobnym do estraverse i buduje test asynchroniczny z synchronizatora?Jak działa zegar jaśminowy?

tylko przykładem tego, co mówię:

it("can test async code with sync testing code", function() { 
    jasmine.clock().install(); 

    var i = 0; 
    var asyncIncrease = function() { 
     setTimeout(function() { 
      ++i; 
     }, 1); 
    }; 

    expect(i).toBe(0); 
    asyncIncrease(); 
    expect(i).toBe(0); 
    jasmine.clock().tick(2); 
    expect(i).toBe(1); 

    jasmine.clock().uninstall(); 
}); 

W tutaj expect(i).toBe(1); powinny być w zwrotnego.

Odpowiedz

10

Funkcja install() faktycznie zastępuje setTimeout funkcją symulacyjną, którą jaśmin zapewnia większą kontrolę. To sprawia, że ​​jest synchroniczna, ponieważ nie jest wykonywane żadne oczekiwanie. Zamiast tego ręcznie przesuń ją do przodu, używając funkcji tick(), która jest również synchroniczna.

Zobacz kod źródłowy: https://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

Załóżmy, że funkcja, która wewnętrznie ustawić limit czasu 5 godzin. Jasmine po prostu zastępuje to wywołanie setTimeout, aby wywołanie było wywoływane, gdy zadzwonisz pod numer tick(), aby wewnętrzny licznik osiągnął lub przekroczył 5-godzinny znak. To całkiem proste!

+0

To nie zadziała w prawdziwym kodzie asynchronicznym, np. przez połączenie db? – inf3rno

+2

@ inf3rno W przypadku ajaxów, chciałbyś wyśmiewać wywołanie ajax (zakładając, że serwer działa) lub testy integracyjne, w rzeczywistości pozwól mu być asynchronicznym. – m59

+0

Ok. Pracuję nad strukturą asynchroniczną dla ES5, dlatego zapytałem. Dzięki! :-) – inf3rno

Powiązane problemy