2014-12-02 64 views
1

我有一些功能測試,運行一個夾具(加載jasmine-jquery),在HTML中有一些Knockout綁定。在每次測試開始時,我想從viewmodel開始處於初始狀態。你如何重置每個茉莉花測試的淘汰賽?

如果我呼籲在beforeEach與視圖模型的新實例,我從淘汰賽

Error: You cannot apply bindings multiple times to the same element.

這個錯誤applyBindings()()如果我試圖恢復現有的視圖模型的性能,以匹配其初始狀態我仍然有錯誤。我相信這是因爲在每次測試之後,燈具的HTML被刪除 - 這可能會破壞綁定?

我也試過一個建議,即came up when Googling這是在Knockout中使用cleanNode函數。這不是API的一部分(它只被設計爲在內部被Knockout使用),無論我嘗試過什麼,它都不能解決問題。

感覺就像我採取了錯誤的做法。 tl; dr;其他人如何測試與茉莉花淘汰賽?

感謝所有幫助

+0

爲什麼你在問類似的問題嗎? http://stackoverflow.com/questions/27247822/how-to-reset-knockout-bindings-in-jasmin-如果你有更多的添加和刪除另一個,只需編輯其中一個。 – Tanner 2014-12-02 14:03:58

+0

另一個問題非常具體。這是關於測試Knockout模式的更開放的問題。 – moefinley 2014-12-02 14:23:54

+0

是的,兩者的背後故事都是一樣的。但我提出了兩個不同的問題,期待着不同的答案。 – moefinley 2014-12-02 14:27:15

回答

2

我通常追加一個元素beforeEach,就可以申請綁定到該元素,並在ko.removeNodeafterEach。喜歡的東西:

  var fixture; 

      beforeEach(function() { 
       fixture = document.createElement("div"); 
       document.body.appendChild(fixture); 
      }); 

      afterEach(function() { 
       ko.removeNode(fixture); 
      }); 

然後用fixture作爲第二個參數,以任何applyBindings調用,如:ko.applyBindings(myTestViewModel, fixture);

+0

工程就像一個魅力。謝謝 – moefinley 2014-12-02 17:21:24

0

我解決了這個正在改變我的js檢查茉莉花例如方式:

if (!window.jasmine) 
    ko.applyBindings(viewModel); 
+1

這看起來像你正在修改你的生產代碼來修復你的測試?除非我錯過了RP尼邁耶建議的解決方案好得多的解決方案。 – moefinley 2015-04-24 16:01:08

+1

我想我錯過了一些東西,但是當我嘗試RP Niemeyer的解決方案時,它不起作用。 ko.applyBindings(myTestViewModel,fixture)應該在哪裏生存,因爲我的applyBindings只和視圖模型一起存在於js文件中。 – 2015-04-24 17:40:32