$httpBackend en Angular moderno
$httpBackend pasa a ser HttpTestingController, que se activa con provideHttpClientTesting. La prueba primero hace la llamada y después responde la petición capturada.
Antes · AngularJS
it('loads users', function () {
$httpBackend.expectGET('/api/users').respond([{ id: 1 }]);
var users;
UserService.getAll().then(function (res) { users = res.data; });
$httpBackend.flush();
expect(users.length).toBe(1);
});
afterEach(function () {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});Después · AngularbeforeEach(() => {
TestBed.configureTestingModule({
providers: [provideHttpClient(), provideHttpClientTesting()],
});
http = TestBed.inject(HttpTestingController);
});
it('loads users', () => {
let users: User[] = [];
TestBed.inject(UserService).getAll().subscribe(res => (users = res));
const req = http.expectOne('/api/users');
expect(req.request.method).toBe('GET');
req.flush([{ id: 1 }]);
expect(users.length).toBe(1);
});
afterEach(() => http.verify());Qué cambia
- El orden se invierte: llama al servicio, y luego usa expectOne para obtener la petición pendiente y hacer aserciones sobre ella.
- Cada petición se responde por separado con req.flush(body); pasa un status y un statusText como segundo argumento para simular un error.
- http.verify() reemplaza a verifyNoOutstandingExpectation y verifyNoOutstandingRequest.
Consejo de migración. Declara provideHttpClient() antes de provideHttpClientTesting(), o el backend de pruebas no se va a usar. Las apps que usaban ngMockE2E para simular toda la API en el navegador necesitan otra herramienta para eso, como un interceptor o un servidor mock.
Relacionado
- Protractor
- $interpolateProvider / $interpolate
- ng-pluralize
- ngMock unit tests (module, inject, $controller)
¿Planeas una migración o una plataforma de microfrontends?
En una llamada de 20 minutos me cuentas tu situación y te digo cómo la abordaría. Si todavía no vale la pena, también te lo digo.
Escríbeme por LinkedIn