在为Karma测试注入时服务没有定义 - AngularJS

时间:2016-02-05 17:56:36

标签: angularjs testing gulp karma-jasmine

我在互联网上看到了一些这样的问题,但没有一个答案似乎解决了我的问题。我有一个在我服务的应用程序中完美运行的服务,但是当我在Karma中测试它时,它没有被定义。

我在src文件夹中有我的模块和相关的控制器,指令和服务。该文件的结构如下:

angular.module('cst-error-framework', ['md.alerts', 'md.input', 'md.modals']);

angular.module('md.alerts', [])
    .directive(//..associated directives here

angular.module('md.input', [])
    //blah blah blah

angular.module('md.modals', [])
    //directives and controllers

   .factory('mdErrorHandler', function () {
        //contents here
    });

我知道这看起来有点麻烦,但我还有其他原因在一个档案中。

然后我对mdErrorHandler的规范如下:

describe('Service errorHandler', function () {

beforeEach(function() {
    module('cst-error-framework');
    angular.mock.module('templates');
});
var mdErrorHandler;

beforeEach(inject(function(_mdErrorHandler_){
    mdErrorHandler = _mdErrorHandler_;
    console.log(mdErrorHandler);
}));

这是我的karma.conf.js

module.exports = function(config) {
  config.set({

   basePath: '',

   frameworks: ['jasmine'],

   files: [
     'bower_components/jquery/dist/jquery.js',
     'bower_components/angular/angular.js',
     'bower_components/angular-sanitize/angular-sanitize.js',
     'bower_components/angular-mocks/angular-mocks.js',

     'dist/cst-error-framework.js',
     'dist/cst-error-framework.css',

     'src/**/templates/*.html',
     'src/helpers/*.js',
     'src/**/test/*.spec.js'
    ],

   preprocessors : {
     'src/**/templates/*.html': 'ng-html2js'
   },

   ngHtml2JsPreprocessor: {
     stripPrefix: 'src/',
     moduleName: 'templates'
   },

   exclude: [],

   port: 9876,

   logLevel: config.LOG_INFO,

   autoWatch: true,

   browsers: [process.env.TRAVIS ? 'Firefox' : 'Chrome'],

   singleRun: false
  });
  'use strict';
  };

然后当我进行业力测试时,我的mdErrorHandler未被定义,因此console.log的结果只是[]

知道发生了什么事吗?是否与Karma加载东西的顺序有关?希望避免必须完全重构我的主.js文件。

修改的 开始怀疑我的gulpfile中的某些内容可能导致问题?这是我的Karma Gulp任务:

gulp.task('karma', ['build'], function(done) {
 karma.start({
   configFile: __dirname + '/karma.conf.js',
   singleRun: true
 }, done);
});

2 个答案:

答案 0 :(得分:1)

在测试中实例化模块时,您不需要函数声明。

所以而不是

beforeEach(function() {
    module('cst-error-framework');
    angular.mock.module('templates');
});

beforeEach(module('cst-error-framework');
beforeEach(angular.mock.module('templates');

答案 1 :(得分:0)

为了运行测试套件,您必须在测试套件中添加至少一个期望值。

describe('Service errorHandler', function() {

    beforeEach(function() {
        module('cst-error-framework');
        console.log(1);
    });
    var mdErrorHandler;

    beforeEach(inject(function(_mdErrorHandler_) {
        mdErrorHandler = _mdErrorHandler_;
        console.log(mdErrorHandler);

    }));

    it('do for nothing', function() {
        expect(true).toBe(true);
    })
});