【问题标题】:how to unit test controller which uses this.get('store')如何对使用 this.get('store') 的控制器进行单元测试
【发布时间】: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')”时抛出错误。我不确定是否需要将事情存根,或者是否有解决方法,因为我的测试用例根本不依赖存储。在任何一种情况下,我都找不到太多东西,并且非常感谢任何反馈。

谢谢,迪恩

JSBINhttp://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


【解决方案1】:

控制器可以从容器中访问存储。您可以创建一个模拟容器并用它实例化控制器。

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,它将所有依赖项(例如存储)连接在一起。

【讨论】:

  • 感谢 Ryan 的回复,我试过了: var mockContainer = new Ember.Container(); mockContainer.register('store:main', { find: function() { console.log("here"); return null; }}); var controller = AS.AnalyticsTemplateNewController.create({ container: mockContainer });但我仍然收到“TypeError:this.get(...) is null”错误
  • 你的小提琴有很多问题。 1)您没有创建商店,您可能应该这样做。 2)您没有给 Ember 足够的时间来初始化所有内容,您只是进入测试阶段(请参阅应用程序 deferReadiness/setupForTesting。3)Nitpick,但您使用的是旧版本的 ember 和数据,升级到最新版本以获得更好的体验。您可能想了解更多关于设置应用程序进行测试的信息:codingvalue.com/blog/testing-emberjs-guide
  • 嗨瑞恩感谢您的链接,我认为这将是一本好书。抱歉,我只是从网上找了一个工作小提琴,并根据我的需要对其进行了修改以获得一些快速反馈 - 但我会通读这篇文章并回到这个问题。
  • 如果您有任何问题,请告诉我,并随时分享尽可能多的小提琴。
  • 嗨 Ryan,我这次创建了一个 jsbin,其中包含 jsbin.com/aMASeq/3 中的最新 js 文件。我找不到指向 expect.js 的托管链接,所以我只是在其中输入了整个代码。当我使用创建函数实例化控制器时,我不确定如何设置商店。谢谢。
猜你喜欢
  • 2012-01-20
  • 2012-04-24
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2012-07-08
  • 2013-03-09
相关资源
最近更新 更多