首页 > 解决方案 > 使用 Injector 进行测试服务

问题描述

我有一个服务在它的依赖项之前被引导,因此我Injector 在它准备好时用来实现我的依赖项。

constructor(private readonly injector: Injector) {
  const interval = setInterval(() => {
    const myService = injector.get(MyService);

    if (myService) {
      this.myService = myService;
      clearInterval(interval);
    }
  }, 200);
}

在我的测试中,我有

beforeEach(() => {
  return TestBed.configureTestingModule({
    providers: [
       {
          provide: MyClass,
          useClass: MyClass,
          deps: [
            Injector,
          ]
       },
       {
         provide: MyService,
         useValue: myServiceMock
       },
     ]
  });
});

问题是TestBed.get(MyService) !== TestBed.get(MyClass).myService

由于某种原因,它变成了相同的两个不同实例。

我如何使成为一个实例?

标签: angularunit-testingdependency-injection

解决方案


通过使用解决fakeAsync。由于服务使用setInterval它最终会在不同的情况下解决。

现在服务分配看起来像这样

beforeEach(fakeAsync(() => {
  myClass = TestBed.get(MyClass);
  tick(200);
  myService = TestBed.get(MyService);
}));

另外我写了一个测试来确保相同的实例

expect(myService).toBe((myClass as any).myService)

推荐阅读