ジャスミンを使ってjavascript/coffeescriptでユニットテストを試してみました。とてもいいです。
jasmine.Clock.Mock()を使用して時間を進め、setTimeoutコールバックを起動しようとしています。
残念ながら、jasmine.Clock.tick(1001)は効果がなかったようです。次に、独自のタイムモックを持つsinon.jsを発見しました。これを使用しても、問題はありませんでした。その理由を知りたいのですが。
テストするダミーのjqueryプラグインは次のとおりです。
dummy_method = function(callback) {
fire_callback = function() {
callback();
}
setTimeout("fire_callback()", 1000);
}
そして、ここに仕様の両方のバージョンがあります:
# Working test (spy was called as expected), using sinon FakeTimers
describe "jQuery.fn.countdown", ->
beforeEach () ->
this.clock = sinon.useFakeTimers();
afterEach () ->
this.clock.restore()
it 'should fireup the callback', ->
countdown_callback = jasmine.createSpy('countdown_callback');
dummy_method(countdown_callback)
this.clock.tick(1001)
expect(countdown_callback).toHaveBeenCalled()
# Non-working test (spy is never called), using jasmine Clock Mock
describe "jQuery.fn.countdown", ->
beforeEach () ->
jasmine.Clock.useMock()
it 'should fireup the callback', ->
countdown_callback = jasmine.createSpy('countdown_callback');
dummy_method(countdown_callback)
jasmine.Clock.tick(1001)
expect(countdown_callback).toHaveBeenCalled()