使用Jasmine对角度服务(非工厂)进行单元测试

时间:2016-09-14 14:16:13

标签: angularjs unit-testing jasmine karma-jasmine

我一直在尝试使用Jasmine跟随教程测试Angular服务,但由于某些原因,他们的示例在这里不起作用(他们建议使用angular.mock.inject()方法注入服务)...

这是我开始工作的方式,但恐怕不应该这样做......

这是“好习惯”吗?为什么注射不起作用?

我基本上将服务导入测试,设置我的模块和$provide服务的依赖项,并new服务传递它通常会注入...

无论如何,这是:

import rolesService from './roles.service.js';

describe('Roles', () => {
  let RolesService;
  let PermRoleStore;
  let USER;

  beforeEach(() => {
    angular.mock.module('roles', ($provide) => {
      $provide.constant('USER', {
        roles: ['SOUTIEN_ORGANISME']
      });
      $provide.value('PermRoleStore', {
        defineManyRoles: jasmine.createSpy(),
      });
    });

    angular.mock.inject((_PermRoleStore_, _USER_) => {
      PermRoleStore = _PermRoleStore_;
      USER = _USER_;

      RolesService = new rolesService(PermRoleStore, USER);
    });
  });

  it('Setup should define the roles', () => {
    RolesService.setup();
    expect(PermRoleStore.defineManyRoles).toHaveBeenCalled();
  });

  describe('authorize', () => {
    it('should return true if authorized', () => {
      expect(RolesService.authorize('SOUTIEN_ORGANISME')).toBe(true);
    });

    it('should return false if the user it NOT authorized', () => {
      expect(RolesService.authorize('NOT_AUTHORIZED')).toBe(false);
    });
  });
});

以下是karma.config.js文件仅供参考:

'use strict';

const stringify = require('stringify');
const babelify = require('babelify');

module.exports = (config) => {
  config.set({
    basePath: '',
    frameworks: ['browserify', 'jasmine-ajax', 'jasmine'],

    files: [
      { pattern: 'build/gouvernementales/app-gouvernementales.config.json', watched: true, served: true, included: false },
      'build/gouvernementales/js/gouvernementales-libs.js',
      'src/apps/gouvernementales/app-gouvernementales.js',
      'src/apps/gouvernementales/**/*.spec.js',
      'src/modules/**/*.spec.js',
    ],

    preprocessors: {
      'src/apps/gouvernementales/app-gouvernementales.js': 'browserify',
      'src/apps/gouvernementales/**/*.spec.js': 'browserify',
      'src/modules/**/*.spec.js': 'browserify',
    },

    browsers: ['PhantomJS'],

    plugins: [
      'karma-phantomjs-launcher',
      // 'karma-chrome-launcher',
      'karma-jasmine-ajax',
      'karma-jasmine',
      'karma-browserify',
      'karma-coverage',
      'karma-mocha-reporter',
    ],

    browserify: {
      debug: true,
      transform: [
        babelify,
        stringify,
      ],
    },

    helpers: [
      'src/spec/helpers/**/*.js',
    ],

    reporters: [
      'mocha',
      'coverage',
    ],

    coverageReporter: {
      dir: 'coverage/',
      reporters: [
        { type: 'text-summary' },
        { type: 'html' },
      ],
    },

    logLevel: config.LOG_DEBUG,

    singleRun: false,

    colors: true,

    autoWatch: true,
  });
};

1 个答案:

答案 0 :(得分:0)

你不需要像这样做

    import rolesService from './roles.service.js'; // it should be not included.
//Should be injected 

<强> BEFOREEACH

beforeEach(() => {
    angular.mock.module(($provide) => {

      $provide.constant('USER', {
        roles: ['SOUTIEN_ORGANISME']
      });
      $provide.value('PermRoleStore', {
        defineManyRoles: jasmine.createSpy(),
      });

    });

    //you are mocking PermRoleStore and USER,so should be inject it here.
//It will get available to your service
//no need of import

    angular.mock.inject((_rolesService_) => { 
      PermRoleStore = _rolesService_;
    });
  });