Angularjs 角度Jasmine服务测试广播未调用

Angularjs 角度Jasmine服务测试广播未调用,angularjs,unit-testing,jasmine,karma-jasmine,Angularjs,Unit Testing,Jasmine,Karma Jasmine,我有一个相当简单的服务,它基本上捕获错误,用特定的错误类型和错误消息增强它们,并广播错误事件,以便我的应用程序的某些部分能够处理该问题。可以找到简化版本 该服务的外观如下所示: angular .module('app', []) .factory('errors', function ($rootScope) { function broadcast (error) { $rootScope.$broadcast('err:'+error.type, error.m

我有一个相当简单的服务,它基本上捕获错误,用特定的错误类型和错误消息增强它们,并广播错误事件,以便我的应用程序的某些部分能够处理该问题。可以找到简化版本

该服务的外观如下所示:

angular
  .module('app', [])
  .factory('errors', function ($rootScope) {
    function broadcast (error) {
      $rootScope.$broadcast('err:'+error.type, error.message, error.error);
    }
    return {
      catch: function (type, message) {
        return function (error) {
          broadcast({
            type: type,
            message: message,
            error: error
          });
        };
      }
    };
  });
现在我想用Jasmine测试一下这个服务是否真的广播了这个错误

为此,我编写了以下测试

describe("errors: Errors (unit testing)", function() {
  "use strict";

  var errors,
      rootScope;

  beforeEach(function(){
    module('app');

    inject(function (_errors_, $injector) {
      errors = _errors_;
      rootScope = $injector.get('$rootScope');
      spyOn(rootScope, '$broadcast');
    });
  });

  it('should broadcast error event', inject(function ($q) {
    $q.reject('error')
      .catch(errors.catch('type', 'message'));

    expect(rootScope.$broadcast).toHaveBeenCalled();
  }));
不幸的是,测试从未通过,因为从未调用
rootScope.$broadcast


我不确定,但我认为这与广播被封装在private
broadcast
函数中这一事实有关。有人知道如何运行测试吗?

您拒绝了承诺,但需要在测试之前调用摘要循环,以便调用承诺的错误回调

做:-


噢,哇,谢谢,这其实是一个很容易解决的问题!我应该考虑一下
     $q.reject('error').catch(errors.catch('type', 'message'));

     rootScope.$digest();

     expect(rootScope.$broadcast).toHaveBeenCalled();