Я новичок в разработке angular и пытаюсь научиться тестировать контроллеры angular. Контроллер, который я тестирую, использует $ location.seach (). Something. Я просмотрел документы для $ location, но не сразу понял, как я должен издеваться над этим в karma / jasmine.
Контроллер:
rmtg.controller('ErrorCtrl', ['Session', '$location', '$routeParams', '$scope', '$window',
function(Session, $location, $routeParams, $scope, $window) {
console.log('ErrorCtrl(%o, %o, %o)', $location.path(), $location.search(), $routeParams);
$scope.status = $location.search().status;
$scope.message = $location.search().message;
$scope.isAuthorized = (typeof(Session.auth) === 'object');
$scope.signin = function() {
$window.location = '/signin/#/' + $routeParams.origin + (Session.auth ? '?email=' + Session.auth.email : '');
};
}]);
Моя текущая попытка спецификации:
'user strict';
describe('Testing the errorCtrl controller', function(){
beforeEach(module("rmtg"));
var errorCtrl, scope;
beforeEach(inject(function($controller, $rootScope){
scope = $rootScope;
errorCtrl = $controller("ErrorCtrl", {
$scope: scope
});
}));
it('$scope.status should be set to 404 when location is set to 404', function(){
//set the $location.search values so that the scope is correct
$location.search('status', '404');
expect(scope.status).toBe('404');
});
});
И текущее сообщение об ошибке: Тестирование контроллера errorCtrl $ scope.status должно быть установлено на 404, когда location установлено на 404 FAILED. Ожидаемое значение undefined равно «404». на объекте. (/Users/adamremeeting/git/mrp-www/app/tests/example.js:20:24)
Я также был бы очень признателен за ссылки на ресурсы на tdd с angular 1.5 и за то, как я правильно издеваюсь и заглушаю.
Изменить после ответа
Поэтому я обновил тест в соответствии с предложениями пользователя 2341963 и приложил все усилия, чтобы просмотреть его пример с плунжером, но все еще не прошел проходной тест.
Текущая спецификация (контроллер не изменился сверху)
'user strict';
describe('ErrorCtrl', function(){
beforeEach(module("rmtg"));
var scope, $location, $controller;
beforeEach(inject(function(_$controller_, _$rootScope_, _$location_){
scope = _$rootScope_.$new();
$location = _$location_
$controller = $_controller_;
}));
describe('$scope.status', function(){
it('should set status to 404', function(){
//set the $location.search values so that the scope is correct
$location.search('status', '404');
//init controller
$controller('ErrorCtrl', {
$scope: scope,
$location: $location
});
expect(scope.status).toBe('404');
});
});
});
Но теперь я получаю сообщение об ошибке, что $ controller не определен.
1 ответ
Вы получаете undefined
в вашем тесте, потому что вы нигде не устанавливаете $location
.
В зависимости от вашего контроллера параметры поиска должны быть установлены до инициализации контроллера. См. Полный пример plunker.
describe('testApp', function() {
describe('MainCtrl', function() {
var scope, $location, $controller;
beforeEach(module('myApp'));
beforeEach(inject(function(_$rootScope_, _$controller_, _$location_) {
scope = _$rootScope_.$new();
$location = _$location_;
$controller = _$controller_;
}));
it('should set status to 404', function() {
// Set the status first ...
$location.search('status', '404');
// Then initialise the controller
$controller('MainCtrl', {
$scope: scope,
$location: $location
});
expect(scope.status).toBe('404');
});
});
});
Что касается ресурсов, пока я обнаружил, что angular docs достаточно хороши.
Похожие вопросы
Новые вопросы
angularjs
Используйте для вопросов об AngularJS (1.x), JavaScript-фреймворке с открытым исходным кодом. НЕ используйте этот тег для Angular 2 или более поздних версий; вместо этого используйте тег [angular].