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'});
但是,这并不会对能力造成任何影响(测试文档说明如何注入服务,而且是相当差的控制器注入)。
有没有人有如何解决这个问题的好主意?
最好的问候, 文森特
什么你正在努力实现似乎stubing的东西在你的应用程序的测试目的。鉴于您正在进行组件集成测试,我会假设您通过moduleForComponent
的ember-qunit
这样做,它依赖于ember-test-helpers
package的TestModuleForComponent
。根据设置的needs:[...]
,integration: true/false
和unit: true/false
属性的组合,此模块的设置将有所不同。然而,如果你通过设置integration: true
或指定needs: ['some']
做集成测试,你可以从你的测试范围内访问所有者是这样的:
test('my test', function(assert) {
const owner = Ember.getOwner(this);
});
你的主人后,你可以在上面做lookup
。对于你的情况,你也可以使用container
其register
和unregister
像这样:
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控制:通过访问ActualController
的someStubbedInjection
道具,你会获得这些数据
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});
});
之后。
您可以通过执行'Ember.inject.controller('controllername')'在另一个控制器中注入控制器,并将所需的属性传递给组件。我不确定你在找什么可能让我们等待答案。 – kumkanillam