单元测试角度服务无法达到服务+茉莉花内的功能

时间:2016-10-16 16:54:13

标签: javascript angularjs unit-testing jasmine karma-jasmine

我已经用角度写了一些服务。请检查此PLUNKER

CommonService, $rootRouter, ModalService中注入RouteService

我坚持使用单元测试这些服务。您可以在PLUNKER看到示例规范文件。

编辑:无论我在plunker进行的任何测试都没有按预期工作。我不确定我做错了什么。

如何在goTo中测试getActivePageRouteService方法?

如何在getProperty中测试setPropertyCommonService方法?

这是代码。

第一项服务是 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');
    }

  });

另一个是 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
    };
  }
);

2 个答案:

答案 0 :(得分:2)

在您的plunker中,您忘记在向其添加服务之前创建mysampleapp模块:

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

CommonService的setter和getter的测试应该非常简单:

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

答案 1 :(得分:2)

在大多数情况下,服务的单元测试应该与其他服务相关。如果您要测试CommonService,您必须模拟其他服务,例如CommonService等。主要原因是您不必担心如何运行其他服务,因为在此测试中您期望其他服务服务将正常运作。

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