【发布时间】:2013-10-31 20:39:56
【问题描述】:
我正在使用 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 调用这些操作函数。发送('actionName')。在我的单元测试中,在实例化控制器之前,我重新打开控制器以修改这些动作函数(更改动作函数比更改 init 函数本身更容易,当尝试更改 init 时,我总是遇到一些 js 错误)。例如:
AS.MyController.reopen({actions: {setSomeActionThatUsesStore: function () {
//do something that doesn't involve using store
}}});
【问题讨论】:
-
你为什么在 init 中调用 store find?
-
我在车把模板中有一个 select 元素,该元素由 find 调用返回的内容填充。我也没有这个控制器的路由器,因为我通过另一个模板中的“渲染控制器”调用它。
-
抛出的错误是什么?
-
我得到 TypeError: this.get(...) is null,我已经在我的原始帖子中添加了 jsfiddle 链接,这会引发同样的错误。
标签: ember.js ember-data mocha.js sinon