2013-03-21 80 views
1

我正在單元測試與茉莉花的EmberJS項目,但我遇到了Ember的需求API的麻煩。茉莉花測試失敗EmberJS需要API

當我嘗試運行茉莉測試,他們沒有創造一個控制器實例,如果有問題的控制器有「需要」,以及調用

this._super一個init()函數

我得到這個控制檯錯誤

「無法調用 '具有' 空的」

當我試圖調試時,將我帶入了Ember的腸子,但是我沒有得到任何幫助。

任何人有任何想法,我做錯了什麼

Application.SearchPendingController = Ember.ObjectController.extend({ 
    needs: ['searchResults', 'search'], 
    shouldDisable: false, 
    searchResultsController: null, 
    init: function() { 
     this._super(); 

     this.set('searchResultsController', this.controllerFor('searchResults')); 

     this.get('controllers.search.content').reload(); 

     this.get('controllers.searchResults').set('content', this.get('controllers.search.content.results')); 

    }, 
    transitionToResults: function() { 
     console.log('yay'); 
    }.observes('this.searchResultsController.content') 
}); 

茉莉花測試拋出一個錯誤,當我嘗試創建該控制器

var searchPendingController = Application.SearchPendingController.create(); 

任何人有任何想法?

回答

8

當您創建控制器時,Ember.js將檢查init方法中的依賴項(needs)。檢查依賴性假定您有一個Ember.js應用程序,並且此應用程序的容器位於控制器的container屬性中。如果Ember.js爲您創建控制器,這一切都很好。

您的錯誤正在發生here,在verifyDependencies函數中。

如果您不希望Ember.js爲您創建控制器並且想要手動創建它(這是您在此處執行的操作),則需要手動將控制器的container屬性設置爲應用程序的容器。

Application.SearchPendingController.reopen({ 
    container: Application.__container__ 
}); 

單元測試控制器很棘手,需要你深入到Ember.js的內部。我的建議是讓Ember.js爲你創建控制器,並使用集成測試代替單元測試。

+0

這完美地工作(減去分號:P)對我來說。謝謝一堆。 – johnjo 2013-03-21 14:40:36

+0

哦,對..固定:) – 2013-03-21 15:34:21

+0

感謝您的支持。似乎像一個愚蠢的檢查..不應該這是默認行爲? 我有''didInsertElement'調用'this.get('controller')。domLoaded()'這個實例化控制器的視圖...我也認爲我可能可以做 'this.set ('childController',App.ChildController.createWithMixins({container:this})''但那不起作用......但是,再次使用'App .__ container__'工作... – ilovett 2013-05-19 06:20:13

0

更好的情況是,如果您的控制器需要訪問另一個控制器來計算某個屬性,那麼該容器將爲您創建控制器。

Application.SearchPendingController = Ember.ObjectController.extend({ 
    needs: ['searchResults', 'search'], 

測試

var searchModel = something, 
    searchResultsModel = something, 
    searchPendingModel = something; 

var container = Application.__container__, 
    searchController = container.lookup('controller:search'), 
    searchResultsController = container.lookup('controller:searchResults'), 
    searchPendingController = container.lookup('controller:searchPending'), 
    searchController.set('model', searchModel), 
    searchResultsController.set('model', searchResultsModel), 
    searchPendingController.set('model', searchPendingModel);