Новый статический метод с именем runInInjectionContext был добавлен к TestBed в Angular v15.1.0-next.0, чтобы упростить тестирование inject(). Функция runInInjectionContext работает аналогично функции runInContext. Допустим, у нас есть функция, которая использует модуль http для получения пользователей:

export function getUsers() {
  return inject(HttpClient).get<User[]>('users');
}

Мы можем проверить это, передав функцию getUsers в TestBed.runInInjectionContext:

import { TestBed } from '@angular/core/testing';
import {
  HttpClientTestingModule,
  HttpTestingController,
} from '@angular/common/http/testing';

describe('Users', () => {

  it('should fetch users', () => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
    });

    const controller = TestBed.inject(HttpTestingController);

    TestBed.runInInjectionContext(getUsers).subscribe((users) => {
      expect(users.length).toBe(1);
    });

    controller.expectOne('users').flush([{ id: 1 }]);
  });

});

Давайте посмотрим еще один пример использования InjectionToken:

export const FOO = new InjectionToken('FOO', {
  providedIn: 'root',
  factory() {
    return 'foo';
  },
});

export function getFoo() {
  return inject(FOO);
}

Допустим, мы хотим протестировать функцию getFoo, но переопределить то, что возвращает FOO:

import { TestBed } from '@angular/core/testing';

describe('Foo', () => {

  it('should get 🔥', () => {
    TestBed.overrideProvider(FOO, { useValue: '🔥' });
    const result = TestBed.runInInjectionContext(getFoo);
    expect(result).toEqual('🔥');
  });

 it('should get 🙌', () => {
    TestBed.overrideProvider(FOO, { useValue: '🙌' });
    const result = TestBed.runInInjectionContext(getFoo);
    expect(result).toEqual('🙌');
  });

});

Это также будет работать с fakeAsync. Допустим, у нас есть провайдер BAR, который возвращает обещание:

import { TestBed, fakeAsync } from '@angular/core/testing';

describe('Bar', () => {

  it('should work with fakeAsync', fakeAsync(() => {
    TestBed.overrideProvider(BAR, { useValue: Promise.resolve('😄') });
    let result = '';

    TestBed.runInInjectionContext(getBar).then((v) => {
      result = v;
    });

    flushMicrotasks();
    expect(result).toEqual('😄');
  }));

});

В более ранних версиях вы можете использовать EnvironmentInjector для проверки:

TestBed.inject(EnvironmentInjector).runInContext(getUsers);

Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Angular и JS!