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

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

问题描述:

我正在面对与我的组件集成测试之一有关的问题。简单地解释一下,我的组件使用一个子组件,它使用一些可以选择的选项来显示。Ember测试:在组件测试中注入控制器

这些能力依赖于控制器来知道哪些是当前项目,因此用户的权限是什么。因此,在我们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'}); 

但是,这并不会对能力造成任何影响(测试文档说明如何注入服务,而且是相当差的控制器注入)。

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

最好的问候, 文森特

+0

您可以通过执行'Ember.inject.controller('controllername')'在另一个控制器中注入控制器,并将所需的属性传递给组件。我不确定你在找什么可能让我们等待答案。 – kumkanillam

什么你正在努力实现似乎stubing的东西在你的应用程序的测试目的。鉴于您正在进行组件集成测试,我会假设您通过moduleForComponentember-qunit这样做,它依赖于ember-test-helperspackageTestModuleForComponent。根据设置的needs:[...],integration: true/falseunit: true/false属性的组合,此模块的设置将有所不同。然而,如果你通过设置integration: true或指定needs: ['some']做集成测试,你可以从你的测试范围内访问所有者是这样的:

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

你的主人后,你可以在上面做lookup。对于你的情况,你也可以使用containerregisterunregister像这样:

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

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

您可以使用相同的技术将控制器“注入”任何您想要的应用程序中。但是这种技术实际上不会真正注入一件事到另一个,但它允许通过你磕碰的属性来访问IE控制:通过访问ActualControllersomeStubbedInjection道具,你会获得这些数据

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}); 
}); 

之后。