Testando funções DI em Angular

Dec 11 2022
Um novo método estático chamado runInInjectionContext foi adicionado ao TestBed no Angular v15.1.

Um novo método estático chamado runInInjectionContextfoi adicionado ao TestBedAngular v15.1.0-next.0 para facilitar o teste inject(). A runInInjectionContextfunção funciona de forma semelhante à runInContextfunção. Digamos que temos uma função que usa o httpmódulo para buscar usuários:

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