2014-12-24 6 views
10

Mam funkcję tak:kątowe jaśmin: „niezdefiniowane” nie jest obiektem - nadawane w ciągu limitu czasu - błąd

$scope.doIt = function(x, y) 
{ 
    $timeout(function() 
    { 
    $rootScope.$broadcast('xxx', 
    { 
     message: xxx, 
     status: xxx 
    }); 
    }); 
} 

Funkcja ta działa dobrze do tej pory. Ale podczas pisania testu miałem pewne kłopoty.

describe('test doIt function...', function() 
     { 
     var $rootScope, $timeout; 

     beforeEach(inject(function (_$rootScope_, _$timeout_) 
     { 
      $rootScope = _$rootScope_; 
      $timeout = _$timeout_; 
      spyOn($rootScope, '$broadcast'); 
      spyOn(scope, 'doIt').and.callThrough(); 
     })); 

     it('test broadcast will be called', inject(function() 
     { 
      var testObj = { 
      message: 'test1', 
      status: 'test2' 
      }; 

      scope.doIt('test1', 'test2'); 

      expect($rootScope.$broadcast).not.toHaveBeenCalledWith('xxx', testObj); 

      $timeout.flush(); 

      expect($rootScope.$broadcast).toHaveBeenCalledWith('xxx', testObj); 

     })); 
     } 
    ); 

będzie zakończyć się następującym błędem:

TypeError: 'undefined' is not an object (evaluating '$rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, $location.$$state, oldState).defaultPrevented')

Dlaczego? Co robię źle? Bez limitu czasu funkcji i testu działa poprawnie.

Z góry dziękuję za pomoc.

:)

Edytuj: Następna emisja, niż oczekiwano, powoduje wydanie tego problemu. hmm

+0

która linia jest błąd wskazując? przed spłukaniem lub po? – elaijuh

+0

Wydaje mi się to nieco skomplikowane, więc nie jestem pewien, co tak naprawdę próbujesz osiągnąć. Zakładam, że definiujesz "zasięg" gdzieś indziej w specyfikacji (i $ scope w testowanym kodzie.) Czy wstrzykniesz $ rootScope do testowanego kodu w dowolnym miejscu? Niezależnie od tego wygląda na to, że nie jest to idealny sposób na testowanie: zamiast szpiegować $ rootScope. $ Broadcast, dlaczego nie po prostu nasłuchiwać emisji w specyfikacji tak samo, jak w normalnym kodzie (np. $ on) –

Odpowiedz

1

Problem -

kątowe ramy próbuje wywołać $broadcast funkcję i spodziewa się obiektu z tej funkcji w zamian które mają defaultPrevented nieruchomości.

Ale ze względu

spyOn($rootScope, '$broadcast');

oświadczenie w beforeEach zablokować faktyczna realizacja $broadcast nie można powoływać się, a tym samym nie zwraca obiekt, który zawiera defaultPrevented nieruchomości.

Solution -

Przesuń oświadczenie spyOn($rootScope, '$broadcast'); z beforeEach blok do it blok dokładnie przed scope.doIt('test1', 'test2');.

+4

Miałem ten sam problem i naprawiłem go ustawiając szpiega na 'andCallThrough()' – Katana24

+0

@ Katana24 Właśnie zaoszczędziłeś mi dużo czasu, wielkie dzięki! – SupimpaAllTheWay

+0

+1 To rozwiązało mój problem. Osobnym testem były rzucanie nieparzystych błędów transmisji. Przeniesienie szpiega do środka to naprawiło. – Jeremy

8

Mam ustalony ten problem przez zwrócenie preventDefault

spyOn($rootScope, '$broadcast').and.returnValue({preventDefault: true}) 
Powiązane problemy