cevap

119

Sadece olay ateşleme ve yakalama üzerinde bazı testlere ihtiyacınız varsa, bunu böyle yaparım. Belirli bir olayın tetiklendiğinden emin olmak için ($emit -ed veya $broadcast10 -ed), casus gitmek için bir yoldur. Sadece böyle bir şey yapmak için daha sonra $emit veya $broadcast ve arayacaktır kapsam başvuru gerekir:

spyOn(scope, "$emit") 
//run code to test 
expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args); 

İhtiyacınız olmayan veya olan argümanlar hakkında endişe istemiyorsanız $emit ile geçirdiğinizde, $rootScope numaralı telefona bir $on ekleyebilir ve etkinliğin yayıldığını öğrenmek için bir bayrak ayarlayabilirsiniz. Böyle bir şey:

var eventEmitted = false; 
$rootScope.$on("MY_EVENT_ID", function() { 
    eventEmitted = true; 
}); 
//run code to test 
expect(eventEmitted).toBe(true); 

test işlevselliği için bir olay ($on) yakalandığı zaman çalışır, biraz daha kolay. işlevinden bir $rootScope alın ve ardından istediğiniz etkinliği gönderin.

$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args); 
//expects for event here 

Şimdi, bu olay işleme bir direktif veya direktif testleri kurma için bir denetleyici (veya her ikisi) de olmayacaktı hayal https://github.com/vojtajina/ng-directive-testing bakın. Denetleyici sınamalarını ayarlamak için bkz. https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

Bu yardımcı olur. kontrolör gibi rootScope kullanarak zam olayı oluşturulduktan sonra

var rootScope; 
var scopeStub = beforeEach(function() { 
    inject(function($rootScope, _$controller_) { 
     rootScope = $rootScope; 
     scopeStub = $rootScope.$new(); 
     $controller = _$controller_; 
    }); 
}); 

: Aşağıda verilen

+0

Bu, tam eşleşmeler için iyidir, ancak bir argüman alt kümesiyle nasıl eşleşir? Örneğin, eğer çarklar sadece bir nesneyse (p1: 'evet', p2: 'hayır'} bu p1'i nasıl beklersiniz: 'evet' p2 ne olursa olsun (ya da olay mevcutsa)? Biliyorum ki 'herhangi bir' yasemin klavyesi var ama bu tam tersi gibi görünüyor - ince taneli yeterince kontrole sahip değil. İstediğiniz yayları bekleyebileceğiniz herhangi bir orta zemin? –

+0

@LukeMadera Jasmine'in jasmine.objectContaining işlevi vardır. Dokümanlardan: jasmine.objectContaining, bir beklentinin sadece gerçek nesnede belirli anahtar/değer çiftlerini önemsediği zamanlar içindir. –

+0

Teşekkürler, ama yasemin kullanmanın bir yolu var mı? Şöyle bir şey: 'beklemek (kapsam. $ Emit.calls.argsFor (0) [0]) toBe ('MY_EVENT_ID'); – cameronroe

0

İşte rootScope ve kapsam saplama başlatmak inijecting iken açısal JS

yılında $ yayın olaya takip etmeli adımlardır aşağıda:

rootScope.$broadcast('eventName', parameter1); 
0

Biz A1

için bu SINTAX kullanılan
=========== Controller ======== 
    var vm = this; 
    $scope.$on('myEvent', function(event, data){ 
     console.log('event number', data.id); 
    }); 
============ Test ============= 
it('should throw myEvent', function() { 
    var data = {}; 
    $scope.$broadcast('myEvent', {id:1}); 
    $scope.$broadcast('myEvent', {id:2}); 
    $scope.$broadcast('myEvent', {id:3}); 
}); 

============ Output ============ 
Chrome LOG: '--------------------------------------------' 
Chrome LOG: 'event number', 1 
Chrome LOG: 'event number', 2 
Chrome LOG: 'event number', 3 
İlgili konular