Testowanie funkcji DI w Angular

Dec 11 2022
Nowa statyczna metoda o nazwie runInInjectionContext została dodana do TestBed w Angular v15.1.

Nowa metoda statyczna o nazwie runInInjectionContextzostała dodana TestBedw Angular v15.1.0-next.0, aby ułatwić testowanie inject(). Funkcja runInInjectionContextdziała podobnie do runInContextfunkcji. Powiedzmy, że mamy funkcję, która używa httpmodułu do pobierania użytkowników:

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

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

});

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

export function getFoo() {
  return inject(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('');
  });

});

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('');
  }));

});

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