2013-06-25 40 views
3

油門淘汰賽視圖模型,這是我的視圖模型如何進行單元測試與Qunit使用上應該觀測

function VM() 
{ 
    var self = this; 

    this.Status = ko.observable(false); 

    this.A = ko.observable(); 

    this.B = ko.computed(
     function() 
     { 
      return self.A(); 
     } 
    ).extend(throttle: 200); 

    this.B.subscribe(
     function() 
     { 
      self.Status(true); 

      setTimeout(//ajax simulation 
       function(){ 
        self.Status(false); 
       } 

      ,200) 
     } 
    ); 

} 

我想測試作爲被設置驗證真假狀態切換,但我可以不會超越虛擬機的雙重異步特性。有沒有辦法用多次stop()/ start()調用來測試它?

回答

5

如果你只是爲了測試什麼的Status切換和false之間true我只想訂閱的Status變化和更改回調是我第一次獲得的價值true和第二次檢查的價值false

編寫測試這種方式,你需要有一個開始/停止對,是這樣的:

asyncTest("computed with ajax", function() { 
    expect(2); // expecting two asserts, so the Status only changes twice 
    var sut = new VM(); 
    // multiple calls to A to test the throttle behavior 
    sut.A('something'); 
    sut.A('something2'); 
    sut.A('something3'); 
    stop(); 
    var callCount = 0; 
    var expectedValues = [true, false]; 
    sut.Status.subscribe(function (value) { 
     start(); 
     equal(sut.Status(), expectedValues[callCount]); 
     callCount++; 
    }); 
}); 

演示JSFiddle.

+0

這是一個有趣的方法,它就像無測試,在那裏你驗證從observable發出的事件序列與預期相符......我將不得不考慮這一點,並嘗試將它應用到我更復雜的真實VM上。 –

+0

@ChrisDaMour你有沒有設法將這個測試想法應用到你的真實虛擬機上? – nemesv

+0

是的,謝謝 –