Working on unit testing can be a crucial part of any Angular project. If you are on the Test-Driven Development approach, there are a lot of benefits to it. In this blog, I will explain, how to unit test Angular component with Spectator.

By the way, let me brief, What is Spectator?

The spectator is a great tool to simplify the unit testing in Angular. It is used to write test cases for components, directives, and services. It is a boilerplate that provides the custom matches to test the HTML DOM element more easily. In this blog, we are using the Karma framework in Spectator for unit testing.

In Angular, generally we need to mock up the functions for unit testing, One of the biggest advantages in Spectator is that we can call it directly in lesser time duration.

Here are some of the important features of Spectator you should know,

Efficient DOM querying

It will support for jasmine and jest

HTTP and routing testing support

It will support testing for angular components, directives, and services

Supports for entry components and component providers

Let’s get started with the installation.

Installation

To install the Spectator, we can use any of the following ways to install the tool in your machine. One way is npm and the other is using Yarn. Install the tool in your convenient way.

NPM

npm install @ngneat/spectator --save-dev 1 npm install @ ngneat / spectator -- save - dev

Yarn

yarn add @ngneat/spectator --dev 1 yarn add @ ngneat / spectator -- dev

Testing Components

Events API

Events which are accepted as the spectator element can be used with any of the following,

type SpectatorElement = string | Element | DebugElement | ElementRef | Window | Document; 1 type SpectatorElement = string | Element | DebugElement | ElementRef | Window | Document ;

If the Spectator element is not provided, the default will be the host element of the component.

click() will trigger the mouse click event.

spectator.click(SpectatorElement); 1 spectator . click ( SpectatorElement ) ;

blur() will trigger the blur event when focussing out of an element.

spectator.blur(SpectatorElement); 1 spectator . blur ( SpectatorElement ) ;

focus() will trigger the focus event when the field is active.

spectator.focus(SpectatorElement); 1 spectator . focus ( SpectatorElement ) ;

typeInElement() will Simulate the user typing.

spectator.typeInElement(value, SpectatorElement); 1 spectator . typeInElement ( value , SpectatorElement ) ;

dispatchTouchEvent() will Trigger the touch event.

spectator.dispatchTouchEvent(SpectatorElement, type, x, y); 1 spectator . dispatchTouchEvent ( SpectatorElement , type , x , y ) ;

Queries

In some cases, we may need to handle a query which is the global level, other than component level. With Spectator, we can do global querying using the root key by the following method.

const element = spectator.query('.some-overlay', { root: true }) 1 2 3 const element = spectator . query ( '.some-overlay' , { root : true } )

Global Injections

Spectator provides the option to use global configuration, in some cases, we may need to use the same configuration across multiple components, modules or providers. In those scenarios, this will be highly helpful. We can use define GlobalsInjections() helper in the test setup.

Mock Providers

We can use the mock option to auto mock the providers. Depending on the class definition it will create the mock object automatically using Jasmine or Jest. For instance, if you want to mock a component, providers, directives, we can use ng-mocks in these cases.

There is no need to import any component, providers, directives, to directly give to mocks option. In case if there is a necessity to replace any child component we can make use of the dummy process.

import { MockComponent, MockDirective } from 'ng-mocks'; const createComponent = createComponentFactory({ Component: appComponent mocks: [FooService], // will create a mocked provider declarations: [ MockComponent(FooComponent), // will create a mocked child component MockDirective(BarDirective), // directive ] }); 1 2 3 4 5 6 7 8 9 import { MockComponent , MockDirective } from 'ng-mocks' ; const createComponent = createComponentFactory ( { Component : appComponent mocks : [ FooService ] , // will create a mocked provider declarations : [ MockComponent ( FooComponent ) , // will create a mocked child component MockDirective ( BarDirective ) , // directive ] } ) ;

Spectator Services

It is pretty simple to implement a Spectator for service testing and to create factory service – createServiceFactory Which returns the factory

It can access the created service using the spectator.service

import { SpectatorService, createServiceFactory } from '@ngneat/spectator'; describe(appService, () => { let spectator: SpectatorService<SomeService>; const createService = createServiceFactory(appService); beforeEach(() => spectator = createService()); it('should appService, () => { spectator.service.serviceMethod(); }); } 1 2 3 4 5 6 7 8 9 import { SpectatorService , createServiceFactory } from '@ngneat/spectator' ; describe ( appService , ( ) = > { let spectator : SpectatorService < SomeService > ; const createService = createServiceFactory ( appService ) ; beforeEach ( ( ) = > spectator = createService ( ) ) ; it ( ' should appService , ( ) = > { spectator . service . serviceMethod ( ) ; } ) ; }

Spectator for HTTP

The spectator can perform an HTTP request and creates a factory data service: createHttpFactory it will return a factory SpectatorHttp. These are the following members,

service – Returns the created service

expectOne(URL: string, method: HttpMethod) – To assert a request and return the TestRequest

httpClient – To access the HttpClient from Angular

controller – To access the HttpTestingController from Angular

import { SpectatorHttp, createHttpFactory, HttpMethod } from '@ngneat/spectator'; import { appDataService } from './app-data.service'; describe('HttpClient testing', () => { let spectator: SpectatorHttp<appDataService>; const createHttp = createHttpFactory(appDataService); beforeEach(() => spectator = createHttp()); it('should retrieve data from API', () => { spectator.service.getDatas().subscribe(); spectator.expectOne('api/data, HttpMethod.GET); }); }); 1 2 3 4 5 6 7 8 9 10 11 import { SpectatorHttp , createHttpFactory , HttpMethod } from '@ngneat/spectator' ; import { appDataService } from './app-data.service' ; describe ( 'HttpClient testing' , ( ) = > { let spectator : SpectatorHttp < appDataService > ; const createHttp = createHttpFactory ( appDataService ) ; beforeEach ( ( ) = > spectator = createHttp ( ) ) ; it ( 'should retrieve data from API' , ( ) = > { spectator . service . getDatas ( ) . subscribe ( ) ; spectator . expectOne ( ' api / data , HttpMethod . GET ) ; } ) ; } ) ;

Conclusion

These bunch of features will help you test angular components. The spectator is one of the amazing tools I’ve tried for angular testing. The steps are quite simple and easy to understand, perform different kinds of testing components. I hope this will help in testing your Angular application.

And also tell me, what tool do you use for testing the angular components?

If you have any doubts or suggestions on this post, let us know in the comment section below. Visit our blog for more recent posts on Angular development. Subscribe now for all exclusive weekly!

Don’t let your ideas fade away over time! Get started with your Angular projects right away with Agira. Hire highly skilled developers in the industry.