【问题标题】:Unit testing decorators in Angular, decorating $log serviceAngular 中的单元测试装饰器,装饰 $log 服务
【发布时间】:2015-05-11 10:24:50
【问题描述】:

虽然以角度对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 配置部分甚至没有被触发。关于如何正确测试这种场景有什么建议吗?

【问题讨论】:

    标签: angularjs unit-testing jasmine angular-decorator


    【解决方案1】:

    您缺少模块('SpecialLogger');调用你的 beforeEach 函数。

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

    只需包含模块并注入 $log。然后检查您的装饰器函数是否存在并按预期运行。

    【讨论】:

    • 是的,我在“混淆”我的真实应用程序代码时打错了字。 'SpecialLogger' 模块在那里实例化,而不是像以前一样 JGM.Logger :) 并且仍然无法正常工作。今天晚些时候将尝试为此代码做一个 plunker。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2012-04-26
      • 2011-03-02
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2016-08-20
      • 2017-08-20
      • 2012-11-01
      相关资源
      最近更新 更多