angularjs - 测试 $broadcast 事件

标签 angularjs jasmine

我有 Angular 测试的问题。我正在尝试测试 $broadcast 是否成功触发。我在尝试使用 spyOn 时出现了一些奇怪的行为。如果您有任何建议,请帮助我几个小时以来一直试图解决这个问题。我的测试是这样的:

describe('Signup controller', function() {

  beforeEach(module('myApp'));

  describe('SignupCtrl', function(){
    var $scope, ctrl, $httpBackend, AUTH_EVENTS, $rootScope;

    beforeEach(inject(function($injector, $controller,
      _$httpBackend_, _apiUrl_, _AUTH_EVENTS_){

        $rootScope = $injector.get('$rootScope');
        $scope = $rootScope.$new();
        ctrl = $controller('SignupCtrl', {$scope: $scope});
        $httpBackend = _$httpBackend_;
        apiUrl = _apiUrl_;
        AUTH_EVENTS = _AUTH_EVENTS_;
        spyOn($rootScope, "$broadcast");
      }
    ));

    afterEach(function() {
      $httpBackend.verifyNoOutstandingExpectation();
      $httpBackend.verifyNoOutstandingRequest();
    });

    it('should show error message from API', function() {
      var apiMessage = 'That email already exists.';
      $httpBackend.expectPOST('/users').respond(400, {
        message: apiMessage
      });

      // call controller register function with mock empty credentials
      $scope.register({});

      $httpBackend.flush();
      expect($rootScope.$broadcast).toHaveBeenCalledWith(AUTH_EVENTS.signupFailed);
      expect($scope.errorMessage).toBe(apiMessage);
      expect($scope.showErrorMessage).toBe(true);
    });

  });
});

我得到的错误是:
TypeError: 'undefined' is not an object (evaluating '$rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
            defaultPrevented')
  at /src/web/src/vendor-bower/angular/angular.js:9789
  at /src/web/src/vendor-bower/angular/angular.js:12595
  at /src/web/src/vendor-bower/angular/angular.js:12407
  at /src/web/src/vendor-bower/angular-mocks/angular-mocks.js:1438

最佳答案

尝试 spyOn(rootScope,'$broadcast').andCallThrough(); 并让我知道它是怎么回事。另见我的评论。

关于angularjs - 测试 $broadcast 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24744001/

相关文章:

javascript - 用 Jasmine 监视 console.error()

typescript - 这在 Jasmine 测试 : Uncaught TypeError: Object prototype may only be an Object or null: undefined? 中意味着什么

javascript - 单页应用程序?登录页面

angularjs - 动态创建的指令属性在 AngularJS 的 ng-repeat 中不起作用

javascript - 无法从 Controller 中的函数获取数据以进行 ng-repeat

javascript - debug/local ("grunt serve") 与 dist/build ("grunt") 的不同设置?

javascript - DevExtreme 和 DxMap 和 DxDataGrid

angularjs - 单元测试依赖注入(inject)

javascript - Jasmine 测试给出错误 "Uncaught ReferenceError: require is not defined"

javascript - 测试 Protractor 中的元素是否被禁用