ankitd
ankitd

Reputation: 2027

unit test angular service not able to reach function inside service + jasmine

I have written some service in angular. Check this PLUNKER.

Injecting CommonService, $rootRouter, ModalService in RouteService.

I am stuck with unit testing these services. You can see sample spec file at PLUNKER.

EDIT: Whatever test I have at plunker are not working as expected. Am not sure what I am doing wrong.

How to test goTo and getActivePage methods in RouteService?

How to test getProperty and setProperty methods in CommonService?

Here is code.

First service is RouteService

'use strict';

angular.module('mysampleapp')
.service('RouteService',
  function(CommonService, $rootRouter, ModalService) {

    console.log('RRRRRRRRRRRRRRRRRRRRRRRRRRRoute');

    return {
      goTo: goTo,
      getActivePage: getActivePage
    };

    function goTo(page) {
      var valid = CommonService.getProperty('isValidationSuccess');

      switch (page) {
        case 'AboutUs':
          if (valid) {
            CommonService.setProperty('activeMenu', page);
            $rootRouter.navigate([page]);
          } else {
            ModalService.openModal('Analysis Error', 'Complete Application Group configuration prior to running analysis.', 'Error');
          }
          break;

        default:
          CommonService.setProperty('activeMenu', page);
          $rootRouter.navigate([page]);
          break;
      }
    }

    function getActivePage() {
      return CommonService.getProperty('activeMenu');
    }

  });

Another is CommonService

'use strict';

angular.module('mysampleapp')
.service('CommonService',
  function() {

    var obj = {
      /* All page validation check before perform analysis */
      isValidationSuccess: false,
      /* Highlight the menu */
      activeMenu: 'HomeMenu'
    };


    function setProperty(key, value) {

      obj[key] = value;
    }

    function getProperty(key) {
      return obj[key];
    }

    function getAllProperties() {
      return obj;
    }

    return {
      setProperty: setProperty,
      getProperty: getProperty,
      getAllProperties: getAllProperties
    };
  }
);

Upvotes: 2

Views: 1796

Answers (2)

rossoneri
rossoneri

Reputation: 528

Unit tests for services in most cases should be islolated from other services. If you going to testing CommonService you must mock other services, such as CommonService and etc. Main reason that you do not have to worry how to run for another service, because in this test you expecting that other services will work correctly.

describe('RouteService', function () {
'use strict';

var RouteService,
    ModalService,
    CommonService,
    mockedValue,
    $rootRouter;

beforeEach(module('mysampleapp'));

beforeEach(inject(function (_RouteService_, _ModalService_, _CommonService_, _$rootRouter_) {
    RouteService = _RouteService_;
    ModalService = _ModalService_;
    CommonService = _CommonService_;
    $rootRouter = _$rootRouter_;

    $rootRouter.navigate = jasmine.createSpy();

    ModalService.openModal = jasmine.createSpy(); //sometimes open modal return promise, and you should check it to

    CommonService.getProperty = jasmine.createSpy().and.callFake(function () {
        return mockedValue;
    });

    CommonService.setProperty = jasmine.createSpy().and.callFake(function () {
        return mockedValue;
    });

}));

it('should exist', function () {
    expect(RouteService).toBeDefined();
});

it('should get active page', function () {
    RouteService.getActivePage();

    expect(CommonService.getProperty).toHaveBeenCalled(); //this test make sens only for make you coverage 100%, in you case i mean
});

describe('goTo method', function () {
    it('should check if it is valid page', function () {
        RouteService.goTo();

        expect(CommonService.getProperty).toHaveBeenCalled();
    });

    it('should set property if page is "about as" and if it is valid page, and should navigate to this page', function () {
        mockedValue = true;

        var page = 'AboutUs';

        RouteService.goTo(page);

        expect(CommonService.setProperty).toHaveBeenCalledWith('activeMenu', page);
        expect($rootRouter.navigate).toHaveBeenCalledWith([page]);

        expect(ModalService.openModal).not.toHaveBeenCalled();
    });

    it('should open modal with error if "about as" is not valid page', function () {
        var isValid = mockedValue = false;

        var page = 'AboutUs';

        RouteService.goTo(page);

        expect(ModalService.openModal).toHaveBeenCalled();

        expect(CommonService.setProperty).not.toHaveBeenCalled();
        expect($rootRouter.navigate).not.toHaveBeenCalled();
    });

    it('should set property and navigate to page', function () {
        var page = 'Test Page';

        RouteService.goTo(page);

        expect(CommonService.setProperty).toHaveBeenCalledWith('activeMenu', page);
        expect($rootRouter.navigate).toHaveBeenCalledWith([page]);

        expect(ModalService.openModal).not.toHaveBeenCalled();
    });
  });
});

Upvotes: 2

Max Koretskyi
Max Koretskyi

Reputation: 105547

In your plunker you forgot to create the mysampleapp module before adding services to it:

angular.module('mysampleapp', []);

The test for setters and getters of CommonService should be pretty simple:

describe('CommonService', function () {
    var commonService;

    beforeEach(module('mysampleapp'));

    beforeEach(inject(function (_CommonService_) {
        commonService = _CommonService_;
    }));

    it('should set and get property', function () {
        commonService.setProperty('isValidationSuccess', 'Perform');
        expect(commonService.getProperty('isValidationSuccess')).toBe('Perform');
    });
});

Upvotes: 2

Related Questions