我是angular and jasmine的新手,并尝试将单元测试编写到现有代码中。 我有一个依赖于记录器对象的公共类的ajax服务。 我需要有关如何在我的jasmine单元测试代码中创建模拟依赖项的帮助。下面的代码是原始代码的剥离版本,只是为了拥有必要的结构。
ajax服务如下所示:
angular.module('my.app.services').factory(serviceId,
['common', 'datacontext', 'profileService', 'programsService']);
function programsService(common, datacontext, profileService) {
var logHttp = common.logger.getLogHttpFn(serviceId);
var service = {
.....
....
return service;
}
服务取决于依赖于记录器的普通类。 常用代码就像这样
var commonModule = angular.module('common', []);
commonModule.provider('commonConfig', function () {
this.$get = function () {
....
};
});
commonModule.factory('common', ['$q', '$location', '$rootScope', '$timeout', '$window', '$filter', 'omniture', 'logger', common]);
function common($q, $location, $rootScope, $timeout, $window, $filter, omniture, logger) {
var service = {
....
};
return service;
});
logger类是这样的: angular.module('common')。factory('logger',['$ log',logger]);
function logger($log) {
};
return service;
function getLogHttpFn(moduleId, severity, showAlertByDefault) {
};
});
这就是我创建模拟的方式:
module('du.app.services','common', function ($provide) {
//common doesn't have any methods, it has a constructor.
loggerMock = jasmine.createSpyObj('logger', ['getLogHttpFn']);
commonMock = jasmine.createSpy('common',['logger']);
dataContextMock = jasmine.createSpyObj('datacontext', ['GetQ']);
profileMock = jasmine.createSpyObj('profileService', ['GetProfile']);
$provide.value('logger', loggerMock);
$provide.value('common', [loggerMock,commonMock]);
$provide.value('datacontext', dataContextMock);
$provide.value('profileService', profileMock);
});
这不起作用我得到错误:未定义不是对象。评估common.logger.getLogHttpFn
答案 0 :(得分:0)
您不会模仿多个级别的依赖项。
如果您的服务使用common
,请执行以下操作:
angular.module('my.app.services')
.factory(serviceId, ['common', programsService]);
function programsService(common) {
var logHttp = common.logger.getLogHttpFn(serviceId);
// .....
}
然后你嘲笑的最远依赖是common
。使用普通对象作为模拟。所以测试的开始应该是这样的:
var commonMock = {
logger: jasmine.createSpyObj('logger', ['getLogHttpFn'])
};
// is the same as
// var commonMock = {
// logger: {
// getLogHttpFn: jasmine.createSpy('getLogHttpFn')
// }
// };
beforeEach(module(function ($provide) {
$provide.value('common', commonMock);
});
beforeEach(module('my.app.services'));