我在Angular中有一个装饰器,它将扩展$ log服务的功能,我想测试它,但我没有看到这样做的方法。这里是我的装饰的存根:如何测试角装饰器功能
angular.module('myApp')
.config(function ($provide) {
$provide.decorator('$log', ['$delegate', function($delegate) {
var _debug = $delegate.debug;
$delegate.debug = function() {
var args = [].slice.call(arguments);
// Do some custom stuff
window.console.info('inside delegated method!');
_debug.apply(null, args);
};
return $delegate
}]);
});
注意,这基本上覆盖$log.debug()
方法,然后做一些定制的东西后调用它。在我的应用程序这个作品,我看到在控制台中的'inside delegated method!'
消息。但在我的测试中,我没有得到那个输出。
我该如何测试我的装饰器功能?
具体来说,我如何注入我的装饰器,使其实际装饰我的$log
模拟实现(请参见下文)?
这是我目前的测试(摩卡/柴,但那不是真正相关的):
describe('Log Decorator', function() {
var MockNativeLog;
beforeEach(function() {
MockNativeLog = {
debug: chai.spy(function() { window.console.log("\nmock debug call\n"); })
};
});
beforeEach(angular.mock.module('myApp'));
beforeEach(function() {
angular.mock.module(function ($provide) {
$provide.value('$log', MockNativeLog);
});
});
describe('The logger', function() {
it('should go through the delegate', inject(function($log) {
// this calls my mock (above), but NOT the $log decorator
// how do I get the decorator to delegate the $log module??
$log.debug();
MockNativeLog.debug.should.have.been.called(1);
}));
});
});
但是这个想法(如果我没有弄错的话)是你装饰你的'$ log',然后用模拟器覆盖整个'$ log'。所以很明显,在你的测试中,你将拥有一个具有简单调试功能的函数。我想我错过了一些东西。 –
我为你创建了一个plunker,我不得不针对角度模拟进行一些修改,但请查看:http://plnkr.co/edit/kim2NTNBp0eflOhFVhF3?p =预览 –
也开始制作一个plunker。请注意,对'angular.module()'的调用需要_two_参数... –