8

Próbuję napisać test jednostki, który sprawdza, czy jest wywoływana $rootScope.$broadcast('myApiPlay', { action : 'play' });.

Oto myapi.js

angular.module('myApp').factory('MyApi', function ($rootScope) { 
    var api = {}; 
    api.play = function() { 
     $rootScope.$broadcast('myApiPlay', { action : 'play' }); 
    } 
    return api; 
}); 

I tu jest mój test Jednostka:

describe('Service: MyApi', function() { 

    // load the service's module 
    beforeEach(module('myApp')); 

    // instantiate service 
    var MyApi; 
    var rootScope; 

    beforeEach(function() { 
     inject(function ($rootScope, _MyApi_) { 
      MyApi = _MyApi_; 
      rootScope = $rootScope.$new(); 
     }) 
    }); 
    it('should broadcast to play', function() { 
     spyOn(rootScope, '$broadcast').andCallThrough(); 
     rootScope.$on('myApiPlay', function (event, data) { 
      expect(data.action).toBe('play'); 
     }); 
     MyApi.play(); 
     expect(rootScope.$broadcast).toHaveBeenCalledWith('myApiPlay'); 
    }); 
}); 

Oto błąd Dostaję podczas uruchamiania grunt test:

PhantomJS 1.9.7 (Windows 7) Service: MyApi should broadcast to pause FAILED 
     Expected spy $broadcast to have been called with [ 'myApiPlay' ] but it was never called. 

Próbowałem również z expect(rootScope.$broadcast).toHaveBeenCalled() i mam podobny błąd: Expected spy $broadcast to have been called..

Chciałbym sprawdzić, czy ta metoda została wywołana z odpowiednimi parametrami.

Dziękujemy!

+0

Czy wystarczy zmienić kolejność? Być może będziesz musiał się spodziewać, zanim zostanie wywołany, w twoim przypadku możesz to nazwać, a potem się tego spodziewać. Możesz również potwierdzić liczbę połączeń. – hassassin

+0

Zmieniłem kolejność, ten sam błąd. – Andrea

Odpowiedz

14

Powodem twoje testy nie mijają się tak, ponieważ jesteś szpiegostwo na niewłaściwej funkcji $ transmisji. W konfiguracji beforeEach poprosisz o wstrzyknięcie $ rootScope, a następnie utworzysz zakres podrzędny, wywołując $ rootScope. $ New().

Wartość zwracana z $ rootScope. $ New() nie jest już rootScope, ale potomkiem zakresu głównego.

beforeEach(function() { 
    //inject $rootScope 
    inject(function ($rootScope, _MyApi_) { 
     MyApi = _MyApi_; 
     //create a new child scope and call it root scope 
     rootScope = $rootScope.$new(); 
     //instead don't create a child scope and keep a reference to the actual rootScope 
     rootScope = $rootScope; 
    }) 
}); 

W funkcji odtwarzania, dzwonisz na transmisję $ $ rootScope ale w teście jesteś szpiegostwo na dziecko $ rootScope.

$rootScope.$broadcast('myApiPlay', { action : 'play' }); 

więc owinąć go, usunąć wywołanie do $ rootScope. $ New() i po prostu szpiegować dolarów rootScope wtryskiwacz ci dał. $ RootScope dostarczony do testu jednostki to ten sam $ rootScope dostarczony do twojej usługi API, więc powinieneś szpiegować bezpośrednio na $ rootScope.

Zapoznaj się z plunkr http://plnkr.co/edit/wN0m8no2FlKf3BZKjC4k?p=preview

+2

jest to w porządku dla 'spodziewać (rootScope. $ Broadcast) .toHaveBeenCalledWith ('myApiPlay', {action: 'play'});' ale to oczekiwanie nie jest wywoływane: 'rootScope. $ On ('myApiPlay', funkcja (zdarzenie , data) {expect (data.action) .toBe ('play');}); ' – Andrea

+1

nie potrzebujesz tego testu. Ten test testuje ramy kątowe, a nie samą logikę biznesową. Możesz założyć, że po wywołaniu rootScope. $ Broadcast, ustawienia detektorów używające $ on będą wywoływane poprawnie, ponieważ tak właśnie działa AngularJS – jcruz

+0

wszystko, co naprawdę musisz przetestować, to $ rootScope.$ broadcast został wywołany z oczekiwanymi parametrami – jcruz

1

To będzie dla ciebie pomocne https://stackoverflow.com/a/17227264/2594499 Twój test nie jest jasny. Unikaj używania "oczekuj" w warunkach, callbackach i podobnych rzeczach. Jeśli twój warunek nie będzie prawdziwy, masz test bez asercji.

Będzie lepiej użyć drugi parametr funkcji:

.toHaveBeenCalledwith('someEvent', someObj); 
+0

Witam, robię tak, jak mówisz, ale test jednostkowy mówi, że nie jest wywołany. Testuję, że po wywołaniu 'MyApi.play()' jest wywoływana wiadomość. – Andrea

Powiązane problemy