angularjs - 在 Angular 中对装饰器进行单元测试,装饰 $log 服务

标签 angularjs unit-testing jasmine angular-decorator

虽然在 Angular 中对服务/ Controller 进行单元测试相当容易,但测试装饰器似乎非常棘手。 这是一个基本场景和我正在尝试但未能获得任何结果的方法:

我定义了一个单独的模块(在主应用程序中使用),用于装饰 $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');调用 beforeEach 函数。

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

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

关于angularjs - 在 Angular 中对装饰器进行单元测试,装饰 $log 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165249/

相关文章:

unit-testing - 在Spock中使用GroovyMock或类似方法模拟静态方法

Java 错误做法 : adding return statement to method solely for testing?

c# - 验证传递给 Mock 的参数是否按预期设置的正确方法

javascript - 如何使用 jasmine.js 测试控制台输出?

javascript - 当我使用 javascript window.location 时,如何使用 Angular JS 重定向到页面

angularjs - 设置 Angular-UI Select2 多重指令的初始值

javascript - 使用 setTimeout 延迟 ng-hide 执行

javascript - 选定的表行 angular.js

rxjs - karma/ Jasmine 弹珠 : test failure message not properly formatted

javascript - Jasmine:单元测试后恢复原型(prototype)方法