Bu olayların doğru şekilde yayılmasını veya yayınlanmasını test etmem ve olayları manuel olarak tetiklemem gerekiyor.Olayları açısal olarak nasıl test edebilirim?
Bunu yapmanın en iyi yolu nedir?
Bu olayların doğru şekilde yayılmasını veya yayınlanmasını test etmem ve olayları manuel olarak tetiklemem gerekiyor.Olayları açısal olarak nasıl test edebilirim?
Bunu yapmanın en iyi yolu nedir?
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 $broadcast
10 -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
İş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);
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
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? –
@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. –
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