从另一个模块中模拟另一个服务中的服务

时间:2016-04-01 11:08:43

标签: angularjs jasmine

我的服务依赖于来自不同模块的其他服务,如下所示:

(function() {
  'use strict';

  angular
    .module('app.core')
    .factory('userService', userService);

  function authService() {

        return: {
            userLoggedIn: false
        }
    }

})();


(function() {
  'use strict';

  angular
    .module('app.services')
    .factory('AuthService', authService);

  authService.$inject = ['$http', 'userService'];

  function authService($http, userService) {
    }

我正在尝试为authService编写测试,但由于无法找到userService

而导致注入错误
beforeEach(function() {
    module('app.services');
});
beforeEach(inject(function(_AuthService_) {
    authService = _AuthService_;

}));

我如何克服这个问题,请$provide帮助我?

更新

我尝试过以下操作,但仍然收到错误

beforeEach(function() {
    module('app.services');
});

beforeEach(inject(function(_AuthService_, _$provide_) {
    authService = _AuthService_;
    $provide = _$provide_;
}));

beforeEach(function() {
    module(function ($provide) {
        $provide.value('userService', function(){
            return {
                userLoggedIn: false
            }
        });
    });
});

解决

好的,所以我只需要做以下事情:

beforeEach(function() {
    module('app.dataservices');
    module(function ($provide) {
        $provide.value('userService', function(){
            return {
                userLoggedIn: false
            }
        });
    });
});

beforeEach(inject(function(_AuthService_) {
    authService = _AuthService_;
}));

测试现在正好对我来说

2 个答案:

答案 0 :(得分:2)

假设您的服务使用$state服务,并且您想要模拟ID。特别是get方法。然后你只需要在第一个describe里面添加这样的内容。

beforeEach(function () {
        module(function ($provide) {
            $provide.service('$state', function() {
                return {
                    get: function() {}
                }
            });
    });
});

this gist中,您可以使用$provide找到一些有趣的模拟服务示例。

答案 1 :(得分:0)

你应该在你的karma.conf.js中预加载所有服务(我假设你正在使用业力)。

这是我们的karma.conf.js文件......

/ **  * Karma测试运行器配置  * / '使用严格的';

module.exports = function (config) {
 config.set({
basePath: './',
browsers: ['PhantomJS'],
frameworks: ['jasmine'],
reporters: ['mocha', 'coverage'],
singleRun: true,
preprocessors: {
  'src/**/!(*spec)*.js': ['coverage'],
  'dest/**/*.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
  stripPrefix: 'dest/',
  moduleName: 'ngHtmlFiles'
},
coverageReporter: {
  type: 'html',
  dir: 'coverage'
},
files: [
  'dest/vendor.min.js',
  'bower_components/angular-mocks/angular-mocks.js',
  'src/**/*.js',
  'dest/**/*.html'
]
});
};