雖然在角度上單元測試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'模塊在那裏被實例化,而不像之前那樣是'JGM.Logger'),並且仍然不能像它應該那樣工作。今天晚些時候會嘗試爲這個代碼做一個笨蛋。 –