2

ジャスミンを使って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()
4

1 に答える 1

3

Jasmineは、渡された引数が関数であるか文字列であるかをsinonがテストする関数を呼び出そうとします。文字列の場合は、を呼び出しますeval

ジャスミン:

jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
  if (jasmine.Clock.installed.setTimeout.apply) {
    return jasmine.Clock.installed.setTimeout.apply(this, arguments);
  } else {
    return jasmine.Clock.installed.setTimeout(funcToCall, millis);
  }
};

シノン:

if (typeof timer.func == "function") {
    timer.func.apply(null, timer.invokeArgs);
} else {
    eval(timer.func);
}

したがって、これはジャスミンテストに合格します

setTimeout(fire_callback, 1000);

これは失敗しますが

setTimeout("fire_callback()", 1000);
于 2012-06-22T20:07:49.893 に答える