Модульное тестирование углового контроллера с использованием переменной захвата для 'this' с синтаксисом controllerAs

0

Я следил за этим руководством по угловому стилю Джоном Паппой, и у меня были проблемы с тестированием с синтаксисом 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
Теги:
unit-testing

1 ответ

0
Лучший ответ

В вашем MainCtrl нет функции addTodo(). Вы addTask() виду запустить addTask()?

  • 0
    Да, это была опечатка. Тест проходит сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню