1

我正在使用 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();
    .....
})  

并且浏览器总是在 init 调用“this.get('store')”时抛出错误。我不确定是否需要将事情存根,或者是否有解决方法,因为我的测试用例根本不依赖存储。在任何一种情况下,我都找不到太多东西,并且非常感谢任何反馈。

谢谢,迪

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

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

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

1 回答 1

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您实例化一个将所有依赖项(例如存储)连接在一起的。

于 2013-11-01T00:01:25.203 回答