2013-10-31 45 views
1

我使用摩卡單元測試我的控制器。我的控制器看起來像:如何使用this.get('store')的單元測試控制器

AS.MyController = Ember.ObjectController.extend(Ember.Validations.Mixin, { 

    name: null, 
    description: null, 

    init: function() { 
     this._super(); 

     this.get('store').find('something'); 
    }, 
    .... 
}); 

而且我的測試是這樣開始的:

describe("MyControllerTest", function() { 
    //tried but didn't work 
    //delete AS.MyController.init; 
    var controller = AS.MyController.create(); 
    ..... 
}) 

,瀏覽器總是會引發錯誤的「this.get(‘商店’)」在初始化呼叫。我不確定是否需要刪除所有內容,或者需要解決它,因爲我的測試用例根本不依賴於存儲。無論哪種情況,我都無法在那裏找到很多東西,並會非常感謝任何反饋。

感謝,迪伊

JSBINhttp://jsbin.com/aMASeq/3/

UPDATE: 可以有很多方法來解決這個問題,但我最終做的是重新構造控制器代碼位把所有的函數調用存儲到不同的動作中,然後在init中使用this.send('actioName')調用這些動作函數。在我的單元測試中,在實例化控制器之前,我重新打開控制器來修改這些動作函數(更改動作函數比改變init函數本身更容易,當嘗試更改init時,我總是遇到一些js錯誤)。例如:

AS.MyController.reopen({actions: {setSomeActionThatUsesStore: function() { 
     //do something that doesn't involve using store 
     }}}); 
+0

爲什麼你打電話給商店查找裏面的init? –

+0

我在句柄模板中有一個select元素,它由查找調用返回的內容填充。我沒有這個控制器的路由器,因爲我通過另一個模板中的「渲染控制器」調用它。 –

+0

拋出的錯誤是什麼? –

回答

2

控制器從容器中獲得對商店的訪問權限。你可以創建一個模擬容器並用它實例化控制器。

var mockContainer = new Ember.Container(); 
mockContainer.register('store:main', Ember.Object.extend({ 
    find: function() { ... } 
}); 

var controller = App.PostController.create({ container: mockContainer }); 

如果您需要訪問真正store那麼你可以只抓住從你的應用程序的容器的控制器。

var controller = App.__container__.lookup('controller:post'); 

這將實例化一個PostController你擁有它的所有連接在一起的依賴關係(如存儲)。

+0

感謝瑞安的迴應,我嘗試過: var mockContainer = new Ember.Container(); mockContainer.register( '店:主',{發現:函數(){ 的console.log( 「這裏」); 返回NULL; }}); var controller = AS.AnalyticsTemplateNewController.create({container:mockContainer}); 但我仍然得到「TypeError:this.get(...)爲空」錯誤 –

+0

你的小提琴有很多問題。 1)你沒有創建一個商店,你可能應該這樣做。 2)你沒有給Ember足夠的時間來初始化所有的東西,你只需要進行測試(參見app deferReadiness/setupForTesting。3)Nitpick,但是你使用的是舊版本的ember和數據,升級到最新版本以改善體驗。您可能想了解更多關於設置您的應用程序進行測試的信息:http://codingvalue.com/blog/testing-emberjs-guide/ – Ryan

+0

嗨,瑞恩感謝您的鏈接,我認爲這將是一個很好的閱讀。對不起,我只是從網上拿了一個工作小提琴,並修改它以滿足我的需要,以獲得一些快速反饋 - 但我會通讀文章並回到問題。 –