2013-05-21 16 views
13

Mam kontroler z detektorem zdarzeń w mojej aplikacji Angular, zdefiniowany w następujący sposób.

angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) { 

    [...] 

    $scope.$on("myEvent", function(args, value) { 
     testService.doStuff(value); 
    }); 
    }); 

Działa to doskonale w samej aplikacji. Jednak przy próbie badanej jednostki funkcjonalność kontrolera (przy Jasmine i Karma), każda metoda badania zgłasza następujący błąd:

TypeError: $scope.$on is not a function in [...]/testController.js 

tworzę kontroler w moich metodach badań w następujący sposób.

it('does stuff', inject(function($rootScope, $controller, testService) { 
    var scope = $rootScope.$new; 
    $controller('TestCtrl', { 
     $scope : scope 
    }); 

    [...] 
    })); 

mogę ominąć ten problem poprzez zmianę mojego kontrolera użyć rootScope zamiast:

$rootScope.$on(...) 

ale to oczywiście aplikacja nie działa już prawidłowo. Mogę również pozbyć się błędów poprzez wprowadzenie metody $on w moim kodu testu:

var scope = $rootScope.$new; 
    scope.$on = function() {}; 

ale szyderczy słuchacza jak tego rodzaju porażek celów testowania mój prawdziwy kod.

Dlaczego nie kod próba znalezienia sposobuscope$on? (Ale znajdzie to na rootScope, nadal ...)

Musi być coś fundamentalnego, czego tu brakuje, ale nie byłem w stanie tego rozgryźć nawet po wielu logowaniu się i czytaniu kodu źródłowego Angulara .

Odpowiedz

16

$rootScope.$new to funkcja. Trzeba ją wywołać ($rootScope.$new()):

it('does stuff', inject(function($rootScope, $controller, testService) { 
    var scope = $rootScope.$new(); 
    $controller('TestCtrl', { 
    $scope : scope 
    }); 

    [...] 
})); 

upadać Przykład: http://plnkr.co/edit/t1x62msmOQDkNItGzcp9?p=preview

+0

dziękuję! To był naprawdę żenujący błąd ... (Argh!) Nie wiem, dlaczego napisałem tak, ale błąd spowodował zainfekowanie wszystkich moich testów. – MJV

Powiązane problemy