DEV Community

Cover image for HTTP requests in Angular.
MD ASHRAF
MD ASHRAF

Posted on Edited on

HTTP requests in Angular.

Without any essay or blog writing lets jump on to very first step to integrate HTTP call in Angular application.

  1. Defining *HttpClientModule * in your module.

module.ts

import { HttpClientModule } from'@angular/common/http'; 
   @NgModule({
     imports: [
       BrowserModule,
       HttpClientModule // Add this line
     ],
     ...
   })
   export class AppModule { }

Enter fullscreen mode Exit fullscreen mode

** * In case of standalone component define this inside imports array of component itself.**

  1. Creating service file to make HTTP calls from there

service.ts

 import { HttpClient } from '@angular/common/http';

   @Injectable({
     providedIn: 'root'
   })
   export class MyService {
     // Injecting httpClient dependency
     constructor(private http: HttpClient) {}

     getData() {
       return this.http.get('https://api.example.com/data');
       // we can use desired rxjs operator here to modify data based on our requirement, for now keeping it simple.
     }
   }

Enter fullscreen mode Exit fullscreen mode
  1. Creating test cases for service file

service.spec.ts

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

describe('MyService', () => {
  let service: MyService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [MyService]
    });
    service = TestBed.inject(MyService);
    httpMock = TestBed.inject(HttpTestingController);
  });

  afterEach(() => {
    httpMock.verify();
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should return data from API', () => {
    // test case to test success scenario
    const testData = { data: 'example data' };
    service.getData().subscribe(data => {
      expect(data).toEqual(testData);
    });

    const req = httpMock.expectOne('(sample link)');
    expect(req.request.method).toBe('GET');
    req.flush(testData);
  });

  it('should handle error', () => {
// test case to test error scenario
    service.getData().subscribe(
      data => {
        fail('should not be called');
      },
      error => {
        expect(error).toBeTruthy();
      }
    );

    const req = httpMock.expectOne('(link unavailable)');
    req.error(new ErrorEvent('Test Error'));
  });
});

Enter fullscreen mode Exit fullscreen mode

OMG !!! what is this **httpMock.verify()** here, seems like alien 👽👽👽.

  1. Checks for outstanding requests: Verifies that all expected requests were made and that there are no outstanding requests.
  2. Verifies request count: Checks that the number of requests made matches the number of expectations set up.
  3. Verifies request URLs and methods: Checks that the URLs and HTTP methods of the requests made match the expectations.

4. Setting request headers

// Step 1
const httpHeaders: HttpHeaders = new HttpHeaders({
Authorization: 'Bearer JWT-token'
});

// Step 2
this.http.post(url, body, { headers: httpHeaders });

5. Calling service method in component

component.ts

import { Component } from '@angular/core';
   import { MyService } from './my-service.service';

   @Component({
     selector: 'app-root',
     template: `
       <p>{{ data | json }}</p>
     `
   })
   export class AppComponent {
     data: any;

     constructor(private myService: MyService) {
       this.myService.getData().subscribe(data => {
         this.data = data;
       });
     }
   }
Enter fullscreen mode Exit fullscreen mode

Comp.spec.ts

Here's an example of how you can write a test case for the Angular component's method using Jasmine and the HttpClientTestingModule:



import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { MyComponent } from './my.component';
import { MyService } from './my.service';

describe('MyComponent', () => {
  let component: MyComponent;
  let fixture: ComponentFixture<MyComponent>;
  let myService: MyService;
  let httpMock: HttpTestingController;

  beforeEach(async () => {. // Focus here
    await TestBed.configureTestingModule({ // Focus here
      imports: [HttpClientTestingModule],
      declarations: [MyComponent],
      providers: [MyService]
    })
      .compileComponents(); // Focus here
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    myService = TestBed.inject(MyService);
    httpMock = TestBed.inject(HttpTestingController);
  });

  afterEach(() => {
    httpMock.verify();
  });

  it('should call myService.getData() and set data', () => {
    const testData = { data: 'example data' };

    spyOn(myService, 'getData').and.returnValue(of(testData));

    component.ngOnInit();

    expect(component.data).toEqual(testData);
  });

  it('should handle error from myService.getData()', () => {
    const error = new ErrorEvent('Test Error');

    spyOn(myService, 'getData').and.returnValue(throwError(error));

    component.ngOnInit();

    expect(component.data).toBeUndefined();
  });
});



Enter fullscreen mode Exit fullscreen mode

Top comments (0)