2014-05-22 22 views
3

我正在嘗試編寫一個單元測試來測試我的控制器。我有一個在模型上使用計算屬性的計算屬性。如何在一個控制器的Ember.js單元測試中設置模型數據

我不確定如何設置測試以將數據加載到模型中。

在這裏,我有我的模型:

App.User = DS.Model.extend({ 
    name: DS.attr('string'), 
    roles: DS.hasMany('role'), 

    isInstructor: function(){ 
    return this.hasRole('instructor'); 
    }.property('roles'), 

    hasRole: function(role_name){ 
    var roles = this.get('roles'); 
    if(!Ember.isEmpty(roles)){ 
     return roles.any(function(role){ 
     return role.get('name') === role_name; 
     }); 
    } 
    return false; 
    } 
}); 

在這裏,我有我的控制器:

App.MyClassDetailsController = Ember.ObjectController.extend({ 
    students: function() { 
    return this.get('users').filter(function (user) { 
     return !user.get('isInstructor'); 
    }); 
    }.property('[email protected]') 
}); 

而且在我的測試中,當我安裝了控制器的內容我這樣做:

myClassDetailsController.set('model', Ember.ObjectProxy.create({ 
    id: 389, 
    name: 'bfcoding 101', 
    users: Ember.ArrayProxy.create({ 
    content: [ 
     Ember.ObjectProxy.create({id: 1, name: 'Joe', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor'})]})}), 
     Ember.ObjectProxy.create({id: 2, name: 'vs', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'student'})]})}), 
     Ember.ObjectProxy.create({id: 3, name: 'Volcano', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'student'})]})}) 
    ] 
    }) 
})); 

而這顯然不會正確加載它。因爲當我打電話給學生的方法:

myClassDetailsController.get('students.length') 

它返回所有的用戶。

這裏是一個jsbin http://jsbin.com/zafod/1/

在jsbin,當它過濾了所有用戶,isInstructor計算的財產不會被調用,因爲該模型數據不會被裝載(我相信)。當我打電話時,它會回到未定義狀態。

那麼如何將這些數據加載到模型中?

謝謝!

+0

我還在尋找到瑞安的'IC-ajax'庫,我們選擇不要在我的代碼中使用它,但這是因爲我們已經寫燼測試了一年左右,所以它沒有增加我們的環境。 – Kingpin2k

回答

5

isInstructor住在App.User的實例上,而不是在Ember.ObjectProxy實例上。您需要在代理實例上創建App.User的實例或剛定義的isInstructor

就我個人而言,我會做後者。在一個完美的單元測試世界中,您正在測試控制器,而不是App.User,所以其他一切應該被嘲弄或假定工作完美。很明顯,當你切換到集成測試這一切的變化,但再次,這是單元測試。

Ember.ObjectProxy.create({id: 1, isInstructor: true, name: 'Joe', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor'})]})}), 

http://jsbin.com/vavikuka/1/edit

+0

啊,好點。由於我已經進行了模型測試以確保isInstructor正常工作,所以嘲笑它會更好。我嘲笑它,現在一切都很好。再次感謝! – bfcoder

相關問題