Новый статический метод с именем 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!