如何单元测试使用this.get('store')的控制器

时间:2013-10-31 20:39:56

标签: ember.js ember-data mocha sinon

我使用mocha对我的控制器进行单元测试。我的控制器看起来像:

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('store')”调用init时抛出错误。我不确定是否需要存根或者有解决方法,因为我的测试用例根本不依赖于存储。在任何一种情况下,我都找不到很多,并且非常感谢任何反馈。

谢谢,Dee

JSBIN http://jsbin.com/aMASeq/3/

更新: 可以有很多方法来解决这个问题,但我最终做的是通过将所有函数调用存储到单独的操作中来重新构造控制器代码,然后在init中使用它来调用这些操作函数。发送( 'actioName')。在我的单元测试中,在实例化控制器之前,我重新打开控制器来修改这些动作函数(它更容易改变动作函数而不是改变初始化函数本身,当试图改变初始化时我总是遇到一些js错误)。例如:

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

1 个答案:

答案 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,它将所有依赖关系(例如商店)连接在一起。