Angular 在每台供应商不';不要注入服务
我试图在Angular 2中测试我的组件,但是当组件的服务不在其提供程序中时,我遇到了问题Angular 在每台供应商不';不要注入服务,angular,angular2-services,Angular,Angular2 Services,我试图在Angular 2中测试我的组件,但是当组件的服务不在其提供程序中时,我遇到了问题 从'angular2/core'导入{Component}; 从“../../services/ServiceName”导入{ServiceName}; @组成部分({ 选择器:“组件名称”, 模板:` ` }) 导出类组件名称{ 构造函数(私有ServiceName:ServiceName){ } } 这是我的测试: 从“”导入{ComponentName}; 从“”导入{ServiceName};
从'angular2/core'导入{Component};
从“../../services/ServiceName”导入{ServiceName};
@组成部分({
选择器:“组件名称”,
模板:`
`
})
导出类组件名称{
构造函数(私有ServiceName:ServiceName){
}
}
这是我的测试:
从“”导入{ComponentName};
从“”导入{ServiceName};
进口{
iit,
信息技术
抄写员,
描述,
期待,,
注射
注入异步,
TestComponentBuilder,
在每个供应商之前,
伪异步,
打上钩
setBaseTestProviders
}来自“angular2/测试”;
在每个提供程序之前(()=>[
服务名
]);
进口{
测试浏览器平台提供商,
测试\浏览器\应用程序\提供者
}来自“angular2/平台/测试/浏览器”;
setBaseTestProviders(测试浏览器平台提供商、测试浏览器应用提供商);
描述('ServiceName',()=>{
它('should have name property set',injectAsync([TestComponentBuilder],(tcb:TestComponentBuilder)=>{
返回tcb.createAsync(ComponentName)。然后((fixture)=>{
fixture.debugElement.componentInstance.isPanelActive=true;
fixture.detectChanges();
编译变量=fixture.debugElement.nativeElement;
expect(compiled.querySelector('a.yes')).toContext('Something');
});
}));
});
我得到的错误是:
Failed: No provider for ServiceName! (ComponentName -> ServiceName)
Error: DI Exception
我尝试了overrideProvide方法,但它不起作用,还尝试在测试中创建TestComponent,并将提供程序与ComponentName指令一起传递到那里
有人知道吗?是否不可能通过引导文件引导服务,而不使用@Component中的提供程序?我认为这就是BeforeAchProviders的全部要点。似乎在测试中,您需要明确定义注入器应该如何实例化给定的令牌。使用此函数:
beforeEachProviders(() => [
provide(ServiceName, {useClass: ServiceName})
]);
解决了。这是System.js配置。它没有给出任何其他错误。因为有这么多的场景,我怀疑是在配置块中使用包造成的。我重新配置了我的业力并测试了以下主要文件:
谢谢我遇到了同样的问题,并通过实现
提供
功能解决了这个问题:
beforeEachProviders(() => [
return provide(ServiceName, {useClass: ServiceName})
]);
您需要确保
返回
提供程序,否则它无法识别。您是否尝试将每个提供程序()之前的移动到description('xxx',(){…})
?是的,没有区别。ServiceName
没有任何构造函数参数?ServiceName有一个构造函数。当然,问题是构造器是否有参数。您能否创建最小的可复制示例(例如github上的test repo)。因为对我来说,你的代码抛出了完全相同的错误,但是使用provide
一切都很好,你能分享一下这个问题吗?我拥有你所拥有的一切,我有点不知所措。