2016-03-08 35 views
1

想知道是否有人可以幫助我 - 我試圖測試我的js使用茉莉花(1.3),我無法弄清楚測試任何方法調用的最佳方法。然後或者.done方法。茉莉花測試方法.done或.then內

示例代碼解釋:

Backbone.View.extend({ 

myMethod: function() { 
    this.something.done(function() { 
    this.doSomethingElse(); 
    }.bind(this)); 
    } 

}) 

我想編寫一個測試,檢查this.doSomethingElse被調用。

我四處尋找jasmine.async和waitsFor/runs的設置,但我不確定它是如何適應外部代碼的,即我不打算在我的實際代碼中調用done()來獲得我的測試加工。此外,如果我嘲笑這個完成的方法,那麼我不再測試實際的實現,對吧?

我只是想念事情如何融合在一起。如果有人能指出我的方向正確,我會非常感激!

更新:根據反饋下面我現在已經嘗試了以下

嘿,感謝您的回答 - 我想,也許我沒有半句正確 - 嘗試兩種不同的方式,無論是初始通但再經過第二故障或2

it('calls doSomethingElse on done',function() { 
    var mockDeferred = $.Deferred(); 

     myView.something = mockDeferred; 
     spyOn(myView,'doSomethingElse'); 
     mockDeferred.resolve(); 

    waitsFor(function() { 
     expect(myView.doSomethingElse).toHaveBeenCalled(); 
    }); 

    }); 

並且:

it('calls doSomethingElse on done',function() { 
    var mockDeferred = $.Deferred(), 
     someTrigger = false; 

    myView.something = mockDeferred; 
    spyOn(myView,'doSomethingElse'); 

    runs(function() { 
    mockDeferred.resolve(); 
    someTrigger = true; 
    }); 

    waitsFor(function() { 
    someTrigger = true; 
    }); 

    runs(function() { 
    expect(myView.doSomethingElse).toHaveBeenCalled(); 
    }); 


}); 

在兩種情況下,測試將通過原本,但後超時失敗後一秒或2.

我錯過了什麼?

回答

1

要測試你描述的例子功能,我會做以下測試內:

  • 創建一個新的Deferred對象(我稱之爲mockDeferred
  • mockDeferred到你的代碼根據測試,以便它現在this.something是你的榜樣
  • 間諜在doSomethingElse功能
  • 呼叫myMethod()
  • 呼叫resolve()mockDeferred
  • 斷言doSomethingElse是基於OP的更新叫

編輯:

我沒有看到任何一個你的例子任何地方你都內調用myView.myMethod()你的測試;確保你這樣做。我掀起了一個例子,你可以參考here

順便說一句,我很驚訝你第一個嘗試通過的第二個例子。也許是因爲你在runs()塊之外有一些代碼?

+0

感謝您的評論已更新上述問題與我已經嘗試過你的方法。這兩種方式在超時後都失敗了,所以如果你有任何反饋,我會很感激! –

+1

對不起,遲到的回覆,查看我更新的答案,並讓我知道如果有幫助! –