虽然在Angular中测试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
配置部分甚至都没有触发。
您缺少模块('SpecialLogger');打电话给您的启动功能。
您不需要此部分:loggerModule = angular.module('JGM.Logger');
只需包括模块并注入$日志即可。然后检查您的装饰函数是否存在并按预期行为。
挖掘后,我提出了一个解决方案。我必须创建并注入自己的嘲讽的$log
实例,直到那时我才能够检查天气或不调用error
功能,还可以触发我使用$log
的全局功能。
详细信息可以在我写的博客文章中找到,以详细解释这个问题。另外,我开了一个Anuglar模块,该模块使用此功能可用