虽然以角度单位测试services/controllers
相当容易,但测试decorators
似乎非常棘手。
这是一个基本的场景和我尝试的方法,但没有得到任何结果:
我定义了一个单独的模块(在主应用中使用),即装饰$log
服务。
(function() {
'use strict';
angular
.module('SpecialLogger', []);
angular
.module('SpecialLogger')
.config(configureLogger);
configureLogger.$inject = ['$provide'];
function configureLogger($provide) {
$provide.decorator('$log', logDecorator);
logDecorator.$inject = ['$delegate'];
function logDecorator($delegate) {
var errorFn = $delegate.error;
$delegate.error = function(e) {
/*global UglyGlobalFunction: true*/
UglyGlobalFunction.notify(e);
errorFn.apply(null, arguments);
};
return $delegate;
}
}
}());
现在是一个测试时间,我很难让它正常工作。这是我到目前为止所提出的:
(function() {
describe('SpecialLogger module', function() {
var loggerModule,
mockLog;
beforeEach(function() {
UglyGlobalFunction = jasmine.createSpyObj('UglyGlobalFunctionMock', ['notify']);
mockLog = jasmine.createSpyObj('mockLog', ['error']);
});
beforeEach(function() {
loggerModule = angular.module('SpecialLogger');
module(function($provide){
$provide.value('$log', mockLog);
});
});
it('should initialize the logger module', function() {
expect(loggerModule).toBeDefined();
});
it('should monkey patch native logger with additional UglyGlobalFunction call', function() {
mockLog.error('test error');
expect(mockLog.error).toHaveBeenCalledWith('test error');
expect(UglyGlobalFunction.notify).toHaveBeenCalledWith('test error');
});
});
}());
调试一段时间后,我注意到SpecialLogger
配置部分甚至没有被解雇..有关如何正确测试这种情况的任何建议吗?
答案 0 :(得分:1)
你错过了模块('SpecialLogger');在你的beforeEach函数中调用。
您不应该需要此部分:loggerModule = angular.module('JGM.Logger');
只需包含模块并注入$ log。然后检查你的装饰器功能是否存在并且行为符合预期。
答案 1 :(得分:1)