2013-10-18 22 views
20

Làm cách nào để kiểm tra phạm vi được điền sau khi phát sóng? Tôi đã tìm kiếm và tìm thấy một vài QA ở đây trong stackexchange, nhưng không ai trả lời vấn đề của tôi. Mã đang hoạt động ổn, chỉ không biết cách kiểm tra nó. Tôi có thể thêm rằng tôi là một người mới để thử nghiệm, và đặc biệt là với Jasmine.

Vì vậy, đây là các mã:

Dịch vụ CrappySvc:

update: function() { 
    $rootScope.$broadcast('updatecrappy', Crappy.query()); 
} 

khiển GetCrappyCtrl:

$scope.$on('updatecrappy', function(event, crap) { 
    $scope.crap = crap; 
    }); 

Jasmine:

beforeEach(inject(function($rootScope, $httpBackend, $controller, Crappy) { 
    rootScope = $rootScope; 
    scope = $rootScope.$new(); 
    Crappy = mockCrappy; 

     ... 
    spyOn(rootScope, '$broadcast'); 
     ... 

    ctrl = $controller('GetCrappyCtrl', { 
    $scope : scope, 
    Crappy : mockCrappy 
});    

}));

it('$scope.$on should have been triggered', function() {   
    rootScope.$broadcast('updatecrappy', [{id : 2, name : 'crappy'}]); 
    expect(rootScope.$broadcast).toHaveBeenCalledWith('updscenes', [{id : 2, name : 'crappy'}]); 

});

Đá

+0

Tôi thấy điều này cũng hữu ích: http://stackoverflow.com/questions/15272414/how-can-i-test-events-in-angular – Ben

Trả lời

36

Bạn cần phải cho Jasmine để cho các cuộc gọi gián điệp $ phát sóng thực tế chức năng

spyOn($rootScope, '$broadcast').andCallThrough(); 

Nếu bạn không sử dụng andCallThrough() các điệp viên không có gì.

Jasmine Docs

EDIT

Với Jasmine 2, cú pháp sẽ là

spyOn($rootScope, '$broadcast').and.callThrough(); 
+0

chúng ta có thể giải thích về điều này thực sự đang làm không? – iamwhitebox

+0

@whitebox Đó là điều, nó không thực sự làm nhiều. Theo mặc định, điệp viên của Jasmine sẽ thay thế chức năng ban đầu đang được theo dõi. Gọi 'and.callThrough()' sẽ thêm vào hành vi mặc định và làm gián điệp * cũng * gọi hàm ban đầu đang được theo dõi. Và đó thực sự là tất cả những gì nó làm. – ivarni

+0

bạn không cần and.callThrough() trong trường hợp này nếu bạn chỉ xác nhận phát sóng được gọi là –

0

Nếu muốn giả mạo các returnValue từ $scope.$broadcast() bạn có thể làm một cái gì đó giống như hai trường hợp sau đây:

Trường hợp 1:

scope.$broadcast('TEST_CHANGED', {test: 'test1'}); 
spyOn(scope, '$broadcast').and.callThrough(); 
expect(something).toEqual('something'); 

Trường hợp 2:

scope.$broadcast('TEST_CHANGED', {test: 'test2'}); 
spyOn(scope, '$broadcast').and.callThrough(); 
expect(something2).toEqual('something2'); 
0

As far as "toHavebeenCalled" có liên quan, không có nhu cầu "andCallThrough()". Điệp viên đơn giản sẽ làm việc. Trong trường hợp của bạn, các đối số của bạn là khác nhau.

Bạn đang phát sóng như, rootScope. $ Broadcast ('updatecrappy', [{id: 2, name: 'crappy'}]);

Nhưng bạn mong đợi:

mong đợi (rootScope $ phát sóng.) .toHaveBeenCalledWith ('updscenes', [{id: 2, và tên: 'không hấp dẫn'}]);

nhìn vào lập luận "updarecrappy" nhưng trong tohavebeencalled nó là "updscenes".

0

Nhìn vào mã mẫu bên dưới, nó hoạt động tốt cho tôi.

Phát ra sự kiện mẫu 'onTimeChanged' từ $ rootScope. Bộ điều khiển của tôi có một người nghe 'onTimeChanged' và tôi đang gọi phương thức timeChanged() bên trong nó.

describe('onTimeChanged()', function() { 
    it('should call another method or controller', function() { 
     spyOn(searchCtrl, 'timeChanged'); 
     $rootScope.$emit('onTimeChanged'); 
     expect(searchCtrl.timeChanged).toHaveBeenCalled(); 
    }); 
}); 

Lưu ý rằng tôi không theo dõi phương thức '$ emit' của rootScope.

Các vấn đề liên quan