Angular 角组件测试注入通用服务
我想在设置Jasmine测试时得到一些帮助,这样我就可以在Angular组件中使用我的通用Typescript服务。解释这个问题最简单的方法就是给你举个例子。我在网上找不到任何解决我确切问题的例子 我有这样的服务:Angular 角组件测试注入通用服务,angular,typescript,generics,jasmine,Angular,Typescript,Generics,Jasmine,我想在设置Jasmine测试时得到一些帮助,这样我就可以在Angular组件中使用我的通用Typescript服务。解释这个问题最简单的方法就是给你举个例子。我在网上找不到任何解决我确切问题的例子 我有这样的服务: MyGenericService<T extends MyParentInterface> { MyService(private serviceDependency: MyDependency){} doWork(obj: T){ /
MyGenericService<T extends MyParentInterface> {
MyService(private serviceDependency: MyDependency){}
doWork(obj: T){
// do work
}
}
我还尝试使用InjectionToken定义类型,如下所示:
@Injectable({
providedIn: 'root',
})
export class MyService extends MyGenericService<MyChildInterface> {
public static TOKEN = new InjectionToken<MyParentInterface>(
'MyService_TOKEN'
);
}
然后注入服务,如下所示:
const myServiceFactoryMock = () => {
return new MyServiceMock<MyChildInterface>();
};
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyComponent],
providers: [
{
provide: 'MyService',
useFactory: myServiceFactoryMock
},
]
}).compileComponents();
}));
@Inject(MyService.TOKEN) private myService: MyService,
看起来您正确地模拟了依赖关系,但可能处于错误的级别,因为我已经检查过,如果提供程序不是单例,而是来自特定组件的另一个实例,则应该以这种方式执行:
TestBed.overrideComponent(MyComponent, {
set: {
providers: [
{provide: 'MyService', useValue: {}} // Mock, spy - whatever you want
]
}
});
编辑1:
在这里,我找到了一些关于
测试床的有用信息。在第一种情况下,您还需要提供ServiceDependency
。如果我模拟了对象,为什么仍然需要这样做?模拟对象没有这种依赖关系。我实际上避免了角度依赖关系注入。我通过使用两个抽象类解决了代码重复的问题。一个用于服务,一个用于组件。该服务注入了两个服务,其中一个为空。抽象组件由两个组件继承。组件注入了他们所需要的服务。为什么要避免角度DI?
{
provide: MyService.TOKEN,
useExisting: forwardRef(() => MyService),
multi: false,
},
@Inject(MyService.TOKEN) private myService: MyService,
TestBed.overrideComponent(MyComponent, {
set: {
providers: [
{provide: 'MyService', useValue: {}} // Mock, spy - whatever you want
]
}
});