单位测试装饰器,Angular,装饰$日志服务



虽然在Angular中测试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');打电话给您的启动功能。

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

只需包括模块并注入$日志即可。然后检查您的装饰函数是否存在并按预期行为。

挖掘后,我提出了一个解决方案。我必须创建并注入自己的嘲讽的$log实例,直到那时我才能够检查天气或不调用error功能,还可以触发我使用$log的全局功能。

详细信息可以在我写的博客文章中找到,以详细解释这个问题。另外,我开了一个Anuglar模块,该模块使用此功能可用

最新更新