- Karma and Jasmine testing tool

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!
ANIL SINGH

Anil Singh is an author, tech blogger, and software programmer. Book writing, tech blogging is something do extra and Anil love doing it. For more detail, kindly refer to this link..

My Tech Blog - https://www.code-sample.com/
My Books - Book 1 and Book 2

www.code-sample.com/. Powered by Blogger.
^