虽然在 Angular 中对服务/ Controller
进行单元测试相当容易,但测试装饰器
似乎非常棘手。
这是一个基本场景和我正在尝试但未能获得任何结果的方法:
我定义了一个单独的模块(在主应用程序中使用),用于装饰 $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');调用 beforeEach 函数。
您不应该需要这部分:loggerModule = angular.module('JGM.Logger');
只需包含该模块并注入(inject) $log。然后检查您的装饰器函数是否存在并按预期运行。
关于angularjs - 在 Angular 中对装饰器进行单元测试,装饰 $log 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165249/