Skip to main content

Angular Testing Questions and Answers | 9, 8, 7, 6

What Is Testing?
The testing is a tools and techniques for a unit and integration testing Angular applications.

Why Test?
Tests are the best ways to prevent software bugs and defects.

How to Setup Test in Angular Project?
Angular CLI install everything you need to test an Angular application.
This CLI command takes care of Jasmine and karma configuration for you.

Run this CLI command-
ng test
The test file extension must be “.spec.ts” so that tooling can identify the test file.
You can also unit test your app using other testing libraries and test runners.

Types of Test
The all great developer knows his/her testing tools use. Understanding your tools for testing is essential before diving into writing tests.
The Testing depends on your project requirements and the project cost. The types of Testing looks like -
1.      Unit Test
2.      Integration Test
3.      End to End (e2e) Test

What is Unit Test in Angular?
The Unit Test is used to testing a single function, single components in Isolation. This is very fast.
The Unit Test is sometimes also called isolated testing

In this Test, we are not able to say that everything is all right in the application. Just for a single Unit or function assure that working fine.

What Is Integration Testing in Angular?
The Integration Testing is used to testing a component with templates and this testing containing more time as per comparison Unit Test.

What is End-to-End (e2e) Testing in Angular?
The End to End Testing is used to testing the entire application looks like -
1.         All User Interactions
2.         All Service Calls
3.         Authentication/Authorization of app
4.         Everything of App

This is the actual testing of your append it is fast action.
Unit testing and Integrations testing will do as fake calls but e2e testing is done with your actual Services and APIs calls.

Recommended Unit Testing Tools –
1.         Karma
2.         Jasmine and
3.         QUnit

Do I Need to Use Protractor?
A protractor is an official library to use for writing End-to-End (e2e) test suites with an Angular app. It is nothing but a wrapper over the Selenium WebDriverJS APIs.

If you have been using Angular CLI, you might know that by default, it comes shipped with two frameworks for testing. They are:
1.      unit tests using Jasmine and Karma
2.      end-to-end tests using Protractor

The apparent difference between the two is that the former is used to test the logic of the components and services, while the latter is used to ensure that the high-level functionality of the application works as expected.

Protractor configuration file is - protractor.conf.js and it look like this.
//Protractor configuration file
const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'chrome'
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  onPrepare() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  }
};

What Is Test Function?
After installing everything as per your project requirements, CREATE your project.
The following Steps –
·             ng new YourTestProject
·             ng install
·             ng serve/ng test

Note – If you are going to development then type “ng server” command and if you want to test your project, you should type “ng test” command.  After type “ng test” command and press enter. It’s taking some time to installing everything in your project for a test.

Test functions–
1.         describe – Test suit (just a function)
2.         it  - The spec or test
3.         expect -  Expected outcome.

Triple Rule of Testing –
1.         Arrange - Create and Initialize the Components
2.         Act - Invoke the Methods/Functions of Components
3.         Assert - Assert the expected outcome/behavior

Best Practices - The quick list of best practices.
1.         Use beforeEach() to Initialize the context for your tests.
2.         Make sure the string descriptions you put in describe () and it () make sense as output
3.         Use after () and afterEach () to clean-up your tests if there is any state that may bleed over.
4.         If any one test is over 15 lines of code, you may need to refactor the test

Example -
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';

//describe – Test suit (just a function)
describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [AppComponent]
    }).compileComponents();
  }));

  //it - The spec or test
  it('should have hello property', function() {
  const fixture = TestBed.createComponent(AppComponent);
  const app = fixture.debugElement.componentInstance;

  //expect – this is expected outcome.
   expect(app.hello).toBe('Hello, Anil!');
 });
});

What is the Jasmine test framework?
Why Jasmine?
Jasmine is a JavaScript testing framework that supports a software development practice called Behaviour Driven Development that plays very well with Karma.

It’s a specific flavor of Test Driven Development (TDD).

Jasmine is also dependency-free and doesn’t require a DOM.

Jasmine provides a rich set of pre-defined matchers - default set of matchers
1.      expect(number).toBeGreaterThan(number);
2.      expect(number).toBeLessThan(number);
3.      expect(array).toContain(member);
4.      expect(array).toBeArray();
5.      expect(fn).toThrow(string);
6.      expect(fn).toThrowError(string);
7.      expect(instance).toBe(instance); represents the exact equality (===) operator.
8.      expect(mixed).toBeDefined();
9.      expect(mixed).toBeFalsy();
10.  expect(mixed).toBeNull();
11.  expect(mixed).toBeTruthy();
12.  expect(mixed).toBeUndefined();
13.   expect(mixed).toEqual(mixed);   represents the regular equality (==) operator.
14.  expect(mixed).toMatch(pattern);  calls the RegExp match() method behind the scenes to compare string data.
15.  expect(number).toBeCloseTo(number, decimalPlaces);
16.  expect(number).toBeNaN();
17.  expect(spy).toHaveBeenCalled();
18.  expect(spy).toHaveBeenCalledTimes(number);
19.  expect(date).toBeAfter(otherDate);
20.  expect(date).toBeBefore(otherDate);
21.  expect(date).toBeDate();
22.  expect(date).toBeValidDate();
23.  expect(object).toHaveDate(memberName);
24.  expect(object).toHaveDateAfter(memberName, date);
25.  expect(object).toHaveDateBefore(memberName, date);
26.  expect(regexp).toBeRegExp();
27.  expect(string).toBeEmptyString();
28.  expect(string).toBeHtmlString();
29.  expect(string).toBeIso8601();
30.  expect(string).toBeJsonString();
31.  expect(string).toBeLongerThan();
32.  expect(string).toBeString();

Default set of Asymmetric Matchers-
1.      jasmine.any(Constructor);
2.      jasmine.anything(mixed);
3.      jasmine.arrayContaining(mixed);
4.      jasmine.objectContaining(mixed);
5.      jasmine.stringMatching(pattern);

Lest see the testing example for AppComponent and it look like this.
import { TestBedasync } from '@angular/core/testing';
import { AppComponent } from './app.component';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
    }).compileComponents();
  }));

  it('should create the app'async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
   
    expect(app).toBeTruthy();
  }));

  it(`should have as title 'app'`async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;

    expect(app.title).toEqual('app');
  }));

  it('should render title in a h1 tag'async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;

    expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
  }));
});

What Is TestBed?
The Angular TestBed (ATB) is a higher level Angular testing framework that allows you to easily test behavior that depends on the Angular Framework.

The TestBed creates a dynamically and The TestBed.configureTestingModule() method takes a metadata object.

We still write our tests in Jasmine and run using Karma but we now have a slightly easier way to create components, handle injection, test asynchronous behaviour and interact with our application.
See the above example.

Lest of some objective questions -
Which of the following can be used to run unit tests?
1.      Karma
2.      Protractor
The correct answer is - Karma!

Which of the following can be used to run end-to-end tests?
1.      Karma
2.      Protractor
The correct answer is - Protractor!

Test doubles are needed when writing which of the following?
1.      Unit tests
2.      End-to-end tests
The correct answer is - Unit tests!

Which of the following will need Angular testing utilities for unit testing?
1.      Services
2.      Components
3.      All the above
The correct answer is - Components!

It is recommended to write isolated unit tests for which of the following?
1.      Services
2.      Pipes
3.      All the above
The correct answer is - All the above!

Which of the following TestBed method is used to create an Angular component under test?
1.      createComponent
2.      createTestingComponent
3.      configureComponent
4.      configureTestingComponent
The correct answer is - createComponent!
By Anil Singh | Rating of this article (*****)

Popular posts from this blog

nullinjectorerror no provider for httpclient angular 17

In Angular 17 where the standalone true option is set by default, the app.config.ts file is generated in src/app/ and provideHttpClient(). We can be added to the list of providers in app.config.ts Step 1:   To provide HttpClient in a standalone app we could do this in the app.config.ts file, app.config.ts: import { ApplicationConfig } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; import { provideClientHydration } from '@angular/platform-browser'; //This (provideHttpClient) will help us to resolve the issue  import {provideHttpClient} from '@angular/common/http'; export const appConfig: ApplicationConfig = {   providers: [ provideRouter(routes),  provideClientHydration(), provideHttpClient ()      ] }; The appConfig const is used in the main.ts file, see the code, main.ts : import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from ...

25 Best Vue.js 2 Interview Questions and Answers

What Is Vue.js? The Vue.js is a progressive JavaScript framework and used to building the interactive user interfaces and also it’s focused on the view layer only (front end). The Vue.js is easy to integrate with other libraries and others existing projects. Vue.js is very popular for Single Page Applications developments. The Vue.js is lighter, smaller in size and so faster. It also supports the MVVM ( Model-View-ViewModel ) pattern. The Vue.js is supporting to multiple Components and libraries like - ü   Tables and data grids ü   Notifications ü   Loader ü   Calendar ü   Display time, date and age ü   Progress Bar ü   Tooltip ü   Overlay ü   Icons ü   Menu ü   Charts ü   Map ü   Pdf viewer ü   And so on The Vue.js was developed by “ Evan You ”, an Ex Google software engineer. The latest version is Vue.js 2. The Vue.js 2 is very similar to Angular because Evan ...

Top 15+ Angular 17 Interview Questions Answers | For Experienced Professionals as well

G Google team released the latest version of Angular – Angular 17 on November 6, 2023, creating a significant milestone for the super fast front-end development. What Are the New Features in Angular 17? 1.       Angular 17 is the highly anticipated release for the community, bringing many new exciting features, updates, and improvements. 2.       New Syntax for Control Flow in Templates - new @if, @switch, @for, @case, @empty @end control flow syntax 3.       Deferred Loading - @defer partial template 4.       The Angular signals API 5.       Angular SSR and client hydration 6.       Automatic Migration to Build-in Control Flow 7.       Build Performance with ESBuild 8.       By default, set this newly generated component as a standalone, and now we don't have an app module file. To use (ng...

How To Optimizing Database Performance: Tips and Techniques for Developers

Best Practices for Optimizing Database Performance: Tips and Techniques for Developers Navigating the labyrinth of database performance optimization can often seem like a daunting task for many professionals. Especially for database developers, mastering this critical skill has immense value, as it enhances both the efficiency and responsiveness of their applications.  Effective database performance optimization leads to faster data retrieval and smoother transactions.  A key challenge, however, lies in knowing  how to hire database developers who are well-versed in optimization techniques. The market is flooded with many professionals, but finding the right expert who understands the intricacies of database performance can be like looking for a needle in a haystack. Employers need to seek those who are not only proficient in their craft but also updated with the latest optimization practices. This guide, therefore, not only aims to provide developers with a compre...

39 Best Object Oriented JavaScript Interview Questions and Answers

Most Popular 37 Key Questions for JavaScript Interviews. What is Object in JavaScript? What is the Prototype object in JavaScript and how it is used? What is "this"? What is its value? Explain why "self" is needed instead of "this". What is a Closure and why are they so useful to us? Explain how to write class methods vs. instance methods. Can you explain the difference between == and ===? Can you explain the difference between call and apply? Explain why Asynchronous code is important in JavaScript? Can you please tell me a story about JavaScript performance problems? Tell me your JavaScript Naming Convention? How do you define a class and its constructor? What is Hoisted in JavaScript? What is function overloadin...