2013-10-31 27 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

嗨,瑞恩感谢您的链接,我认为这将是一个很好的阅读。对不起,我只是从网上拿了一个工作小提琴,并修改它以满足我的需要,以获得一些快速反馈 - 但我会通读文章并回到问题。 –