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
mà dòng là lỗi trỏ đến? cái trước khi tuôn ra hay sau? – elaijuh
Đ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) –