我在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_參數... –