2014-12-24 30 views
10

Tôi có một chức năng như thế này:nhài góc: 'undefined' không phải là một đối tượng - phát sóng trong thời gian chờ - Lỗi

$scope.doIt = function(x, y) 
{ 
    $timeout(function() 
    { 
    $rootScope.$broadcast('xxx', 
    { 
     message: xxx, 
     status: xxx 
    }); 
    }); 
} 

Chức năng này hoạt động tốt cho đến nay. Nhưng trong khi viết một bài kiểm tra tôi đã có một số rắc rối.

describe('test doIt function...', function() 
     { 
     var $rootScope, $timeout; 

     beforeEach(inject(function (_$rootScope_, _$timeout_) 
     { 
      $rootScope = _$rootScope_; 
      $timeout = _$timeout_; 
      spyOn($rootScope, '$broadcast'); 
      spyOn(scope, 'doIt').and.callThrough(); 
     })); 

     it('test broadcast will be called', inject(function() 
     { 
      var testObj = { 
      message: 'test1', 
      status: 'test2' 
      }; 

      scope.doIt('test1', 'test2'); 

      expect($rootScope.$broadcast).not.toHaveBeenCalledWith('xxx', testObj); 

      $timeout.flush(); 

      expect($rootScope.$broadcast).toHaveBeenCalledWith('xxx', testObj); 

     })); 
     } 
    ); 

này sẽ kết thúc trong các lỗi sau:

TypeError: 'undefined' is not an object (evaluating '$rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, $location.$$state, oldState).defaultPrevented')

Tại sao? Tôi đang làm gì sai? Nếu không có $ timeout trong chức năng và kiểm tra nó hoạt động tốt.

Cảm ơn trước sự giúp đỡ của bạn.

:)

Chỉnh sửa: Một lần phát sóng khác dự kiến ​​sẽ phát hành vấn đề này. hmm

+0

mà dòng là lỗi trỏ đến? cái trước khi tuôn ra hay sau? – elaijuh

+0

Điều này có vẻ hơi khó khăn, vì vậy tôi không chắc chắn những gì bạn đang thực sự cố gắng để có được tại. Tôi giả sử bạn đang xác định "phạm vi" ở một nơi khác trong spec (và $ scope trong code-under-test.) Bạn đang tiêm $ rootScope vào mã-under-test ở bất cứ đâu? Bất kể, điều này có vẻ như một cách ít lý tưởng để kiểm tra: hơn là gián điệp trên $ rootScope. $ Broadcast, tại sao không chỉ đơn giản là lắng nghe phát sóng trong spec của bạn giống như cách bạn làm trong mã bình thường (ví dụ, $ scope. $ on) –

Trả lời

1

Vấn đề -

khuôn khổ Góc đang cố gắng gọi $broadcast chức năng và mong đợi một đối tượng từ chức năng mà lại có defaultPrevented tài sản.

Nhưng vì

spyOn($rootScope, '$broadcast');

tuyên bố trong beforeEach chặn việc thực hiện thực tế của $broadcast không thể được viện dẫn và do đó nó không trả về một đối tượng, trong đó có defaultPrevented tài sản.

Solution -

Di chuyển báo cáo kết quả spyOn($rootScope, '$broadcast'); từ beforeEach khối it khối chính xác trước khi scope.doIt('test1', 'test2');.

+4

Tôi đã có cùng một vấn đề và cố định nó bằng cách thiết lập các điệp viên để 'andCallThrough()' – Katana24

+0

@ Katana24 Bạn chỉ cần tiết kiệm cho tôi rất nhiều thời gian, cảm ơn rất nhiều! – SupimpaAllTheWay

+0

+1 Điều này đã giải quyết được vấn đề của tôi. Một thử nghiệm riêng biệt đã ném các lỗi phát sóng lẻ. Di chuyển điệp viên vào nó cố định nó. – Jeremy

8

Tôi đã cố định vấn đề này bằng cách trả lại preventDefault

spyOn($rootScope, '$broadcast').and.returnValue({preventDefault: true}) 
Các vấn đề liên quan