Angular中的单元测试装饰器,装饰$ log服务

时间:2015-05-11 10:24:50

标签: angularjs unit-testing jasmine angular-decorator

虽然以角度单位测试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配置部分甚至没有被解雇..有关如何正确测试这种情况的任何建议吗?

2 个答案:

答案 0 :(得分:1)

你错过了模块('SpecialLogger');在你的beforeEach函数中调用。

您不应该需要此部分:loggerModule = angular.module('JGM.Logger');

只需包含模块并注入$ log。然后检查你的装饰器功能是否存在并且行为符合预期。

答案 1 :(得分:1)

经过一番挖掘,我想出了一个解决方案。我必须创建并注入我自己的模拟$log实例,然后才能检查天气或不调用error函数也触发调用我正在装饰$log的全局函数。

详细信息可以在我写的blog post上找到,以便详细解释这个问题。另外,我开源了一个使用此功能here

的anuglar模块