2013-07-26 14 views
7

Używam Mocha do pisania testów dla interfejsu API węzła. W jednym teście muszę wykonać 2 akcje i porównać sygnatury czasowe każdego z nich i upewnić się, że są różne. Aby to zrobić, muszę niezawodnie wstrzymać wykonanie testu na co najmniej sekundę. Próbowałem użyć setTimeout, aby wstrzymać wykonywanie Mocha przed drugim połączeniem z ping, ale to się nie dzieje.Użycie funkcji setTimeout() wstrzymanie testu mokki

it('should insert then update the timestamp.', function(done) { 
    Do.ping('arg1', function(err, result) { 
    should.not.exist(err); 

    setTimeout(Do.ping('arg1', function(err, result) { 
     // Test that the timestamp of the first ping is before the timestamp 
     // of the second ping (among other things) 
     done(); 
    }), 1000); 
    }); 
}); 

Ktoś widzi to, co tu spartaczę? Alternatywnie, czy istnieje lepszy (tj. Bardziej Mocha-ish) sposób robienia tego, co próbuję zrobić?

Odpowiedz

2

Skończyło się na tym, że korzystałem z fałszywego interfejsu API Sinona i działało świetnie. Wywołaj i zresetuj fałszywy zegar odpowiednio w beforeEach() i afterEach(). W rzeczywistym teście, tylko przesunąć zegar w jakikolwiek sposób trzeba:

clock.tick(180000); // Advances the JS clock 3 minutes (180 seconds) 
0

Pozwól mi zaproponować (niesprawdzone) alternatywę:

var async = require('async') 
it('should insert then update the timestamp.', function(done) { 
    async.series([ 
    Do.ping('arg1', function(err, result) { 
    should.not.exist(err); 
    }, 
    setTimeout(console.log('waiting'),1000); 
    }, 
    Do.ping('arg2', function(err, result) { 
    should.not.exist(err); 
    }, 
    done();] 
    }); 
}); 

myślę za pomocą async.series będziesz mógł bardziej wiarygodnie wstrzymać mokka z dostaniem się do drugiego naboru.

+0

Dzięki. Próbowałem już pakietu z sinonami do manipulowania zegarem JS i do tej pory pracowałem całkiem nieźle. –

0

Dodałem pakiet sleepfor korzystając npm install sleepfor. W moim testu mam następujące:

const sleepfor = require('sleepfor'); 

describe('My Test', function() { 
    it('should test something here.', function(){ 
     // Run some test code here. 
    }); 
    it('should test something ELSE here.', function(){ 
     // Run different test code here. 
    }); 

    afterEach(function(){ 
     var d = new Date(); 
     console.log(d.toLocaleString() + " >> Before sleep."); 
     sleepfor(5000); 

     var d = new Date(); 
     console.log(d.toLocaleString() + " >> After sleep."); 
    }); 
}); 

powinno być oczywiste, ale tylko w przypadku, afterEach nazywa się po każdej z blokować egzekucji.

+0

Znacznie lepiej jest użyć metody z [zaakceptowanej odpowiedzi] (https://stackoverflow.com/a/18000251/1906307) niż użyć czegoś takiego jak 'sleepfor'. Każdy test * koniecznie * potrwa co najmniej 5 sekund. Zacznij dodawać testy do pakietu i wkrótce będziesz czekał na minutę. Teraz wykonaj ten sam test, manipulując zegarem, a wykonanie testu potrwa milisekundę. Ponadto 'sleepfor' tak naprawdę" nie śpi ": uruchamia pętlę podczas interwału, o który pytasz. Twój proces będzie wykorzystywał procesor w tym czasie: marnowanie zasobów! Ponownie, manipulowanie zegarem pozwala uniknąć tego problemu. – Louis

+0

Tak, źle zrozumiałem pytanie. Natknąłem się na to pytanie, szukając przerw między kolejnymi testami. Dodam jeszcze, że w moim przypadku w końcu skończyłem właśnie używając 'browser.pause (...)'. Dopasował mnie dobrze, ale jak zaznacza @Louis, nie jest to odpowiedź na to pytanie. –