Without any essay or blog writing lets jump on to very first step to integrate HTTP call in Angular application.
- Defining *HttpClientModule * in your module.
module.ts
import { HttpClientModule } from'@angular/common/http';
@NgModule({
imports: [
BrowserModule,
HttpClientModule // Add this line
],
...
})
export class AppModule { }
** * In case of standalone component define this inside imports array of component itself.**
- 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.
}
}
- 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'));
});
});
OMG !!! what is this **httpMock.verify()**
here, seems like alien 👽👽👽.
- Checks for outstanding requests: Verifies that all expected requests were made and that there are no outstanding requests.
- Verifies request count: Checks that the number of requests made matches the number of expectations set up.
- 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;
});
}
}
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();
});
});
Top comments (0)