如何测试角度装饰器功能

时间:2014-03-18 18:33:19

标签: angularjs testing angularjs-decorator

我在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模拟实现(见下文)?

这是我目前的测试(mocha / chai,但这并不相关):

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);
    }));
  });
});

0 个答案:

没有答案