Я использую angularJs, и я хочу проверить $ на событие в моем контроллере, поэтому я пытаюсь написать тестовый пример следующим образом:
beforeEach(inject(function ($controller,$injector) {
$rootScope = $injector.get('$rootScope');
$scope = $rootScope.$new();
controller = $controller('MyController', {
$scope: $scope
});
}));
spyOn($rootScope, '$broadcast').and.callThrough();
spyOn($rootScope, '$on').and.callThrough();
it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
controller = CreateTarget();
expect($rootScope.$broadcast).toHaveBeenCalled();
expect($rootScope.settings.layout.pageBodySolid).toBe(false);
});
Но я получаю эту ошибку:
Ошибка: spyOn не смог найти объект для шпионажа для $ broadcast()
Я также пытаюсь сделать тест таким образом:
beforeEach(inject(function ( $controller,$injector) {
$rootScope = $injector.get('$rootScope');
$scope = $rootScope.$new();
controller = $controller('MyController', {
$scope: $scope
});
CreateTarget = function() {
$controller('MyController', {$scope: $scope});
}
}));
it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
controller = CreateTarget();
$rootScope.$broadcast('$viewContent');
expect($rootScope.settings.layout.pageBodySolid).toBe(false);
});
На этот раз я получаю эту ошибку
TypeError: невозможно прочитать свойство "макет" неопределенного
И это мое событие контроллера
$scope.$on('$viewContent', function () {
$rootScope.settings.layout.pageBodySolid = false;
$rootScope.settings.layout.pageSidebarClosed = false;
});
Я не знаю, как я могу это сделать. Это действительно мой первый опыт тестирования angularJs. Мне нужна ваша помощь. Спасибо заранее.
Здесь есть несколько вопросов:
Во-первых, spyOn
. Объем $scope
вы передаете в контроллер, на самом деле является новым экземпляром, но вы $rootScope
объектом $rootScope
, так что это два совершенно разных экземпляра.
Во-вторых, вы не обязательно хотите проверить, что $broadcast
или $on
вызываются, потому что тогда вы по существу тестируете Angular. То, что вы хотите протестировать в этих случаях, - это ваш собственный код и результат трансляции событий.
Итак, в вашем случае, что вы хотите проверить, так это то, что "когда получено событие $ viewContent, эти два свойства на $rootScope
должны быть установлены в false.
Это приводит меня к третьему моменту: layout undefined
сообщение layout undefined
состоит в том, что вы пытаетесь установить значение в свойстве settings
$rootScope
, но никогда не инициализируете это ни к чему. В тот момент, когда вы его устанавливаете, он не определен.
TL; DR, вот как вы могли бы это проверить (обратите внимание: этот код может потребоваться изменить. Я набираю это по памяти и не тестирую на самом деле, это просто для того, чтобы дать вам идею)
beforeEach(inject(function ($controller, $injector, _$rootScope_) {
$rootScope = _$rootScope;
$scope = $rootScope.$new();
$rootScope.settings = {
layout : {
pageBodySolid : true,
pageSidebarClosed : true
}
};
controller = $controller('MyController', {
$scope: $scope
});
}));
it('should set $rootScope.settings.layout properties to false', function() {
$rootScope.$broadcast('$viewContent');
// Run a digest to notify watchers
$rootScope.$digest();
expect($rootScope.settings.layout.pageBodySolid).toBe(false);
expect($rootScope.settings.layout.pageSidebarClosed).toBe(false);
});
inject function
потому что при запуске теста я получаю эту ошибку:Expected true to be false.