2013-05-26 12 views
60

में ब्रॉडकास्ट ईवेंट का परीक्षण कैसे कर सकता हूं मेरे पास एक नियंत्रक है जो जड़कोड़ पर एक प्रसारण कार्यक्रम उत्सर्जित करता है। मैं परीक्षण करना चाहता हूं कि ब्रोकास्ट इवेंट सही ढंग से निकाल दिया गया है।मैं कोणीयजेएस

मेरी नियंत्रक में मेरे कोड इस तरह दिखता है:

$scope.$watch("pageIndex", function(){ 
    if($scope.pageIndex == 4) 
    { 
     // emit social share 
     $rootScope.$broadcast('myEvent'); 
    } 
    }); 

मैं निम्नलिखित कोड के साथ परीक्षण करने के लिए प्रयास किया है:

it('Should call myEvent when pageIndex is 4',function(){ 
    scope.pageIndex = 4; 
    scope.$apply(); 
    expect(rootScope.$on).toHaveBeenCalledWith('myEvent'); 
}); 

लेकिन यह है कि कोड नहीं बुलाया जाता है मुझसे कहता है, जिसे मैंने मैन्युअल रूप से परीक्षण किया है कि यह करता है। मैंने फिर निम्नलिखित कोड के साथ प्रयास किया है:

it('Should call myEvent when pageIndex is 4',function(){ 
    var listener = jasmine.createSpy('listener'); 
    rootScope.$on('myEvent', listener); 
    scope.pageIndex = 4; 
    scope.$apply(); 
    expect(listener).toHaveBeenCalled(); 
}); 

लेकिन उसी नकारात्मक परिणाम के साथ। क्या यह जांचने का कोई तरीका है कि एक ईवेंट प्रसारित किया जाता है?

उत्तर

109

मान लीजिए कि आप जैस्मीन का उपयोग कर रहे हैं, निम्नलिखित मेरे लिए बहुत अच्छा काम कर रहा है।

... other unit test setup code ... 

var rootScope; 
beforeEach(inject(function($injector) { 
    rootScope = $injector.get('$rootScope'); 
    spyOn(rootScope, '$broadcast'); 
})); 

describe("my tests", function() { 
    it("should broadcast something", function() { 
     expect(rootScope.$broadcast).toHaveBeenCalledWith('myEvent'); 
    }); 
}); 

आप एक संदेश का प्रसारण और इसे करने के लिए वस्तुओं संलग्न कर रहे हैं, तो आप भी परीक्षण कर सकते हैं कि वस्तुओं की उम्मीदों से मेल

someObj = { ... something ... }; 
expect(rootScope.$broadcast).toHaveBeenCalledWith('someEvent', someObj); 
+0

यह पूरी तरह से काम करता है..चर्स साथी। –

+0

@ माइक: मोचा/चाई के साथ आप इस समाधान का कोई उदाहरण दिखा सकते हैं? –

+0

@RyanConaway - चाई के लिए ऐसा लगता है कि आपको एक spy प्लगइन की आवश्यकता होगी जैसे https://github.com/chaijs/chai-spies। मोचा के लिए, http://sinonjs.org/ देखें। उन दोनों के लिए प्रलेखन इस बात को लेकर स्पष्ट हैं कि आप इस समाधान को पुस्तकालय के साथ कैसे प्राप्त करेंगे। –

9

यहां बताया गया है इसके mochaJs के साथ किया, मजाक उड़ाता है और के लिए चाय के लिए सिनोन साथ उम्मीदों।

describe("broadcast test", function() { 
    beforeEach(inject(function($rootScope){ 
    sinon.spy($rootScope, "$broadcast") 
    scope.foo() //this broadcasts the event. $rootScope.$broadcast("testEvent") 
})) 

it("broadcasts the event", inject(function($rootScope){ 
expect($rootScope.$broadcast.calledWith("testEvent")).to.be.true 
})) 

}) 
संबंधित मुद्दे