在测试angular 2组件时,如何模拟@injected服务?
我有一个带有签名的组件:在测试angular 2组件时,如何模拟@injected服务?,angular,testing,dependency-injection,jasmine,Angular,Testing,Dependency Injection,Jasmine,我有一个带有签名的组件: constructor(private loremApiService: LoremApiService, private ipsumService: IpsumService, private dolorService: DolorService, @Inject('sitService') private sitService: library.service.Service) { } 元件的等级库文件设置为: let comp
constructor(private loremApiService: LoremApiService,
private ipsumService: IpsumService,
private dolorService: DolorService,
@Inject('sitService') private sitService: library.service.Service) {
}
元件的等级库文件设置为:
let component: PowerBiReportComponent;
let fixture: ComponentFixture<TestingComponent>;
const mockLoremApi = { methodThatIsCalled: () => {} };
const mockIpsumService = { };
const mockSitService = { };
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TestingComponent ],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
providers: [
{ provide: LoremApiService, useValue: mockLoremApi },
{ provide: IpsumService, useValue: mockIpsumService },
UnmockedService,
{ provide: library.service.Service, useValue: mockSitService }
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
如何强制TestingModule使用mockSitService,尽管它被@Injected到组件中?如注释中所述,Angular需要
@injecte(…)
中的任何标记与在使用Angular的DI设置服务时为提供属性提供的标记相同。这也意味着注入令牌应该导出到模块外部,以便其他人使用@Inject()
语法
如果服务是这样提供的:
@NgModule({
providers: [
{ provide: SERVICE_TOKEN, useClass: Service }
]
})
然后@Inject()
应该这样设置(使用相同的注入令牌):
因此,在测试中,您可以通过以下方式模拟它(同样,使用相同的注入令牌):
有关注入令牌的更多信息,请参阅。您是否尝试执行:{provide:'sitService',useValue:mockSitService}
?@DanielWStrimpel不幸的是,未经授权的服务是通过import*作为库从'sit library'导入的代码>,所以我不能那么具体。同样,不幸的是,实际的服务类型被命名为service
,@Inject(…)
中的任何内容都应该作为provide
属性给出。Angular的较新版本要求(或强烈建议?)这些是注入令牌@DanielWStrimpel Ahhh,我已在测试中更改了提供对象,以匹配组件父模块中的注入令牌。现在它抛出了一个[object ErrorEvent]错误
,这可能是由于未实现模拟而导致实际测试代码失败的一部分。这可能会修复问题Check my response在这里您可以找到模拟服务的示例如果您有一个模块,它使用forRoot
作为其可注入令牌,并且您想测试其中一个使用注入令牌的服务MyModule.forRoot(MyModuleConstants)
有一个服务MyModuleService
和构造函数(@Inject(MyInjectionToken)常量)
useClass
而不是useValue
?@gaoshenhan语法取决于您提供的内容。在模块中设置时,它使用useClass
,以便Angular为您创建实例。在测试中,OP有一些变量是stubbed服务的实例,因此可以使用useValue
版本的provide语法。
@NgModule({
providers: [
{ provide: SERVICE_TOKEN, useClass: Service }
]
})
constructor(@Inject(SERVICE_TOKEN) private service: Service) {
}
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{ provide: SOME_TOKEN, useValue: mockService }
]
})
.compileComponents();
}));