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
która linia jest błąd wskazując? przed spłukaniem lub po? – elaijuh
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) –