Angular 角组件测试注入通用服务

Angular 角组件测试注入通用服务,angular,typescript,generics,jasmine,Angular,Typescript,Generics,Jasmine,我想在设置Jasmine测试时得到一些帮助,这样我就可以在Angular组件中使用我的通用Typescript服务。解释这个问题最简单的方法就是给你举个例子。我在网上找不到任何解决我确切问题的例子 我有这样的服务: MyGenericService<T extends MyParentInterface> { MyService(private serviceDependency: MyDependency){} doWork(obj: T){ /

我想在设置Jasmine测试时得到一些帮助,这样我就可以在Angular组件中使用我的通用Typescript服务。解释这个问题最简单的方法就是给你举个例子。我在网上找不到任何解决我确切问题的例子

我有这样的服务:

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