2013-07-26 7 views
7

Ich verwende Mocha, um Tests für eine Node-API zu schreiben. In einem Test muss ich 2 Aktionen ausführen und den Zeitstempel jedes einzelnen vergleichen und sicherstellen, dass sie unterschiedlich sind. Um das zu tun, muss ich die Testausführung für mindestens eine Sekunde zuverlässig anhalten. Ich habe versucht, setTimeout zu verwenden, um die Mocha-Ausführung vor dem zweiten Aufruf an ping anzuhalten, aber es passiert nicht.Verwenden von setTimeout() Pausieren eines Mocha-Tests

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

Wer sieht, was ich hier gebohrt habe? Alternativ, gibt es eine bessere (d. H. Mehr Mocha-ish) Art zu tun, was ich versuche zu tun?

Antwort

2

Ich endete mit Sinons gefälschten Timer-API und es funktioniert super. Instanziieren und setzen Sie den falschen Timer in beforeEach() bzw. afterEach() zurück. Im eigentlichen Test voran einfach die Uhr in welcher Weise auch immer Sie brauchen:

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

ich eine (nicht getestet) Alternative Lassen Sie vorschlagen:

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

Ich denke, durch async.series Sie werden in der Lage, zuverlässige Mokka Pause davon ab, auf den zweiten Anruf mit.

+0

Danke. Ich habe das Sinon-Paket ausprobiert, um die JS-Uhr zu manipulieren, und bis jetzt hat das ziemlich gut funktioniert. –

0

ich hinzugefügt habe das sleepfor Paket mit npm install sleepfor. In meinem Test habe ich folgendes:

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."); 
    }); 
}); 

offensichtlich sein sollte, aber nur für den Fall wird afterEach nach jedem Ihrer es Block Ausführungen genannt.

+0

Es ist viel besser, das Verfahren in der [akzeptierten Antwort] zu verwenden (https://stackoverflow.com/a/18000251/1906307) als so etwas wie 'sleepfor' verwenden. Jeder Test dauert * mindestens * 5 Sekunden. Beginnen Sie, der Suite Tests hinzuzufügen, und schon bald warten Sie Minuten. Führen Sie den gleichen Test durch, indem Sie die Uhr manipulieren, und der Test dauert Millisekunden. Außerdem schläft 'sleepfor' nicht wirklich" schlafe ": Es läuft eine Schleife während des Intervalls, das du fragst. Ihr Prozess wird Ihre CPU in dieser Zeit verzehren: eine Verschwendung von Ressourcen! Durch das Manipulieren der Uhr wird dieses Problem vermieden. – Louis

+0

Ja, ich habe die Frage falsch verstanden. Ich bin auf diese Frage gestoßen, als ich untersucht habe, wie ich zwischen den Tests pausieren/schlafen kann. Ich würde auch hinzufügen, dass ich in meinem Fall schließlich nur die 'browser.pause (...)' verwendet habe. Es hat mir gut getan, aber wie @Louis darauf hinweist, ist es nicht die Antwort auf diese Frage. –