2015-05-11 152 views
2

雖然在角度上單元測試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配置部分甚至沒有解僱..如何正確地測試這種情景有什麼建議?

回答

1

你錯過了模塊('SpecialLogger');調用beforeEach函數。

你不應該需要這個部分:loggerModule = angular.module('JGM.Logger');

就包括模塊和注入$日誌。然後檢查你的裝飾器函數是否存在,並按預期行爲。

+0

是的,我做了一個錯字,而'混淆'我的真實應用程序的代碼。 'SpecialLogger'模塊在那裏被實例化,而不像之前那樣是'JGM.Logger'),並且仍然不能像它應該那樣工作。今天晚些時候會嘗試爲這個代碼做一個笨蛋。 –

1

經過一番挖掘,我想出了一個解決方案。我不得不創建並注入我自己的嘲弄的$log實例,只有這樣我才能夠檢查天氣或不調用error函數也觸發器調用我正在裝飾$log的全局函數。

詳情可以在我寫的blog post上詳細解釋這個問題。另外,我開放源代碼anuglar模塊,利用此功能可用here