Ho bisogno di verificare che gli eventi vengano correttamente emessi o trasmessi e attivino manualmente gli eventi.Come posso testare gli eventi in modo angolare?
Qual è il modo migliore per farlo?
Ho bisogno di verificare che gli eventi vengano correttamente emessi o trasmessi e attivino manualmente gli eventi.Come posso testare gli eventi in modo angolare?
Qual è il modo migliore per farlo?
Se hai solo bisogno di test sull'attivazione e l'attivazione degli eventi, questo è il modo in cui lo faccio. Per garantire che un determinato evento venga attivato ($emit
-ed o $broadcast
-ed), una spia è la strada da percorrere. È necessario un riferimento al campo di applicazione che verrà chiamando il $emit
o $broadcast
, e poi solo per fare qualcosa di simile:
spyOn(scope, "$emit")
//run code to test
expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args);
Se non è necessario o non si vuole preoccupare gli argomenti che sono superato con il $emit
, si può mettere un $on
sulla $rootScope
e impostare un flag per conoscere l'evento è stato emesso. Qualcosa di simile a questo:
var eventEmitted = false;
$rootScope.$on("MY_EVENT_ID", function() {
eventEmitted = true;
});
//run code to test
expect(eventEmitted).toBe(true);
Per la funzionalità di test che viene eseguito quando un evento viene catturato ($on
), è un po 'più facile. Basta ottenere un $rootScope
dalla funzione inject
e quindi inviare l'evento desiderato.
$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args);
//expects for event here
Ora, immagino che questo la gestione degli eventi sarebbe successo in una direttiva o di un controller (o entrambi) Per la realizzazione di prove di direttiva, vedi https://github.com/vojtajina/ng-directive-testing. Per l'impostazione dei test del controller, vedere https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27
Spero che questo aiuti.
Questi sono i passi da seguire per $ evento di trasmissione in angolare JS
Mentre inijecting inizializzare la rootScope e la portata stub come indicato di seguito:
var rootScope;
var scopeStub = beforeEach(function() {
inject(function($rootScope, _$controller_) {
rootScope = $rootScope;
scopeStub = $rootScope.$new();
$controller = _$controller_;
});
});
Dopo controller è creato evento raise usando rootScope come qui di seguito:
rootScope.$broadcast('eventName', parameter1);
Abbiamo usato questo sintassi per A1
=========== 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
Questo è utile per le corrispondenze esatte, ma come si potrebbe abbinare un sottoinsieme di argomenti? Ad esempio se gli argomenti sono solo un oggetto {p1: 'si', p2: 'no'} come ti aspetteresti che p1: 'si', non importa quale sia p2 (o se esiste un evento)? So che c'è la "qualsiasi" tastiera del gelsomino, ma sembra che sia l'opposto - non un controllo abbastanza preciso. Una via di mezzo dove puoi aspettarti solo gli args che vuoi? –
@LukeMadera Jasmine ha 'jasmine.objectContaining'. Dalla documentazione: jasmine.objectContain è per quei momenti in cui un'aspettativa interessa solo determinate coppie chiave/valore nell'oggetto reale. –
Grazie, ma ci sarebbe un modo di usare il gelsomino? Qualcosa come: 'expect (scope. $ Emit.calls.argsFor (0) [0]). ToBe ('MY_EVENT_ID');' – cameronroe