0

我想通過.on在我的指令中測試$廣播(從控制器)的接收器。在指令預期間諜測試.on得到函數

指令:

describe('<-- myDirective Spec ------>', function() { 

    var scope, $compile, element, $httpBackend, rootScope; 

    beforeEach(angular.mock.module('myApp')); 

    beforeEach(inject(function (_$rootScope_, _$compile_, _$httpBackend_) { 
     scope = _$rootScope_.$new(); 
     $compile = _$compile_; 
     $httpBackend = _$httpBackend_; 
     rootScope = _$rootScope_; 

     var html = '<my-directive></my-directive>'; 
     element = $compile(angular.element(html))(scope); 

     spyOn(scope, '$broadcast').and.callThrough(); 
     scope.$digest(); 
    })); 

    it('should be defined', function() { 
     expect(element).toBeDefined(); 
    }); 

    it('should broadcast ', function() { 
     scope.$broadcast('sendEmail'); 
     expect(scope.$on).toHaveBeenCalledWith('sendEmail', jasmine.any(Function)); 
    }); 
}); 

通過上述,我得到錯誤:

Expected a spy, but got Function. 
+1

更換

spyOn(scope, '$broadcast').and.callThrough(); 

您是在'$範圍從事間諜活動。$ broadcast',不'$ on'。 – Lee

回答

1

更新:

您可以測試簡單,如果你的$廣播獲取調用與

expect(scope.$broadcast).toHaveBeenCalled() 

或實際測試$上做類似

scope.$on('sendEmail', spyFunction) 
expect(spyFunction).toHaveBeenCalledWith('sendEmail') 

原因:$廣播實際上並不在函數調用$。 $ on是一個偵聽器,它在偵聽事件(第一個參數)時調用回調函數(作爲第二個參數傳遞)。


您目前正在監聽範圍的$ broadcast函數,並且已經在函數上對$進行了測試。您需要通過

spyOn(scope, '$on').and.callThrough(); 
+0

厭倦了這一點,請參閱錯誤:期待的間諜$已被['sendEmail',]調用,但它從未被調用過。 –

+1

這是一個不同的問題。這意味着你的測試失敗了,即$ on沒有被調用,reason:它從來沒有真正被調用過,它是你傳遞的第二個參數getback的第一個參數作爲參數傳遞的回調函數。 – yoogeeks

相關問題