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

不想你离开。 提交于 2020-01-04 05:32:27

问题


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
    };
  }
);

回答1:


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');
    });
});



回答2:


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();
    });
  });
});


来源:https://stackoverflow.com/questions/40072869/unit-test-angular-service-not-able-to-reach-function-inside-service-jasmine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!