risposta

119

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.

+0

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? –

+0

@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. –

+0

Grazie, ma ci sarebbe un modo di usare il gelsomino? Qualcosa come: 'expect (scope. $ Emit.calls.argsFor (0) [0]). ToBe ('MY_EVENT_ID');' – cameronroe

0

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); 
0

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