Я следил за этим руководством по угловому стилю Джоном Паппой, и у меня были проблемы с тестированием с синтаксисом controllerAs. В частности, в руководстве говорится использовать переменную захвата, например var vm = this;
чтобы избежать привязки вещей к $ scope внутри контроллера.
Моя проблема возникает, когда я начинаю тестировать контроллеры, используя эту переменную захвата. Когда я создаю контроллер в своем модульном тесте, я не могу вызывать методы, привязанные к переменной захвата.
Мой код выглядит следующим образом:
контроллер:
(function(){
'use strict';
/**
* @ngdoc function
* @name mytodoApp.controller:MainCtrl
* @description
* # MainCtrl
* Controller of the mytodoApp
*/
angular.module('mytodoApp')
.controller('MainCtrl', function ($scope) {
/* jshint validthis: true */
var vm = this;
vm.tasks = [];
vm.addTask = addTask;
vm.removeTask = removeTask;
function addTask() {
if(!contains(vm.tasks, $scope.task)){
vm.tasks.push($scope.task);
} else {
vm.isInvalid = true;
}
$scope.task = '';
};
function removeTask(index) {
vm.tasks.splice(index, 1);
};
var contains = function(list, item) {
var res = list.indexOf(item);
return res === -1 ? false : true;
};
});
})();
Unit тест:
'use strict';
describe('Controller: MainCtrl', function () {
// load the controller module
beforeEach(module('mytodoApp'));
var MainCtrl,
scope;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
MainCtrl = $controller('MainCtrl', {
$scope: scope
// place here mocked dependencies
});
}));
it('should attach a list of tasks to the viewmodel', function () {
expect(MainCtrl.tasks.length).toBe(0);
});
it('should add items to the list', function() {
scope.task = 'example task';
MainCtrl.addTodo();
expect(MainCtrl.tasks.length).toBe(1);
});
});
Я получаю эту ошибку:
PhantomJS 1.9.8 (Mac OS X 0.0.0) Controller: MainCtrl should add items to the list FAILED
TypeError: 'undefined' is not a function (evaluating 'MainCtrl.addTodo()')
at /Users/kyle/Code/AngularProjects/mytodo/test/spec/controllers/main.js:28
В вашем MainCtrl
нет функции addTodo()
. Вы addTask()
виду запустить addTask()
?