Sergey
Sergey

Reputation: 7692

Testing services with Injector

I have a service which is bootstrapped before its dependency and therefore I use Injector to achieve my dependency when it's ready.

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

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

In my test I have

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

The problem is that TestBed.get(MyService) !== TestBed.get(MyClass).myService.

By some reason it became two different instances of the same.

How do I make the to be one instance?

Upvotes: 1

Views: 28

Answers (1)

Sergey
Sergey

Reputation: 7692

Solved by using fakeAsync. Since a service uses setInterval it eventually resolves in different instances.

Now service assignment looks like this

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

Additionally I've written a test to ensure same instance

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

Upvotes: 1

Related Questions