2014-03-27 53 views
0

我試圖測試使用動作委派的簡單組件。我想測試某個動作是否發送到組件的actionDelegate。我正在考慮使用Sinon來檢查是否發送了這個操作,但我無法弄清楚如何複製Ember用來將其操作發送給其代表/目標的結構。Emberjs測試組件的動作代理

我的sinon「間諜代表」對象爲了讓我檢查組件是否在用戶點擊按鈕時使用「發送」來委託事件,會使用什麼結構?

我已經創建了一個我想要在http://jsfiddle.net/L3M4T/進行測試的事物的例子,但是它沒有圍繞它進行測試(爲了簡單而將測試工具放在組件周圍是一件很重要的工作js小提琴 - 事實上,把這個組件變成我想解釋這個問題的形狀是相當有份量的)。

這裏是我的組件:

App.AppProfileComponent = Ember.Component.extend({ 
    actionDelegate: null, 
    actions: { 
     hello: function(person) { 
      if(!Ember.isEmpty(this.get('actionDelegate'))) { 
       this.get('actionDelegate').send('hello', person); 
      } 
     } 
     } 
}); 

而且我inital嘗試沒有工作,只是寫了一個測試,在它有這個片段(使用興農& qunit):

visit("/").click("button").then(function() { 
    equal(actionDelegateSpy.called, true, "Action delegate should be called when button pressed"); 
}); 

我認爲這很明顯,爲什麼沒有工作,但因爲我已經嘗試了以下,這也沒有工作:

var actionDelegateSpy = sinon.spy(); 
var actionDelegate = Ember.ObjectController.extend({ 
    actions: { 
    "hello" : actionDelegateSpy 
    } 
}).create(); 

然後通過傳入上面定義的actionDelegate作爲測試組件上的actionDelegate進行測試。

回答

2

我固定我自己的問題......我傻:

test("delegates its hello action to actionDelegate", function() { 
    var actionDelegateSpy; 

    Ember.run(function() { 
     actionDelegateSpy = sinon.spy(); 
     var actionDelegate = Ember.ObjectController.extend({ 
     actions: { 
      "hello" : actionDelegateSpy 
     } 
     }).create(); 
     controller.set('actionDelegate', actionDelegate);  
    }); 

    visit("/").click("button") 
    .then(function() { 
     equal(actionDelegateSpy.called, true, "Action delegate should be called when hello button pressed"); 
    }); 
    }); 
+0

這是「明顯的」固定通過實現所有異步行爲必須以Ember.run通話包裹運行鍼對預期之前,它同步它。 –