Ember测试:在组件测试中注入控制器

时间:2016-09-21 13:44:44

标签: testing ember.js

我在某个组件集成测试中遇到了一些问题。简要说明一下,我的组件使用了一个子组件,它使用一些ember-can功能来选择要显示的选项。

能力依赖于控制器来了解哪个是当前项目,因此用户的权限是什么。所以在我们的app.js文件中,我们有类似的东西:

application.inject('ability', 'projectController', 'controller:project');

当然,在对组件进行集成测试时,该功能无法找到控制器或项目,因此始终认为用户没有所需的权限。

我到目前为止尝试了这样的东西:

this.register('controller:project', Ember.Object.create({
  project: this.project
}));
this.inject.controller('controller:project', {as: 'projectController'});

但是这对能力没有任何影响(测试文档显示了如何注入服务,但在控制器注入方面相当差)。

有没有人对如何解决这个问题有个好主意?

祝你好运, 文森特

1 个答案:

答案 0 :(得分:0)

您尝试实现的目标似乎是在您的应用程序中存在用于测试目的的东西。鉴于您正在进行组件集成测试,我认为您通过moduleForComponent ember-qunit依赖TestModuleForComponent packageember-test-helpers进行组件集成测试。此模块的设置将有所不同,具体取决于在其上设置的needs:[...]integration: true/falseunit: true/false属性的组合。但是,如果您通过设置integration: true或指定needs: ['some']进行集成测试,则可以从测试范围内访问所有者,如下所示:

test('my test', function(assert) {
    const owner = Ember.getOwner(this);
});

获得所有者后,您可以对其进行lookup。对于您的情况,您也可以使用container及其registerunregister,如下所示:

test('my test', function(assert) {
    this.container.unregister('controllers:my-controller');
    this.container.register('controllers:my-controller', ActualController.extend({
        someStubbedProp: 'value'
    }), {instantiate: false});
});

请注意,如果您正在处理单例对象(例如适配器),则指定{instantiate: false}以确保它们未在注册时实例化,因为它们将在应用程序启动时实例化。

您可以使用相同的技术来注射"注射"将控制器插入您应用中的任何内容。然而,这种技术实际上并不会真正地向另一个注入一个东西,但它允许通过你正在存根的属性来访问控制器:

test('my test', function(assert) {
     this.container.unregister('controllers:my-controller');
     this.container.register('controllers:my-controller', ActualController.extend({
         someStubbedInjection: Ember.computed({
             get(){
                 return Ember.getOwner(this).lookup('controller:some-other-controller-you-want-to-access');
             }
         })
     }), {instantiate: false});
 });

之后,访问someStubbedInjection上的ActualController道具,您就可以访问它了。