Error: addTodo() method does not exist - why does it throw this error?

Error: addTodo() method does not exist - why does it throw this error?

我已经盯着它看了好几个小时了,但我不明白它出了什么问题。它只是告诉我当我在控制器文件中定义它时 addTodo 方法不存在 - 我在这里缺少什么?

main.js

angular.module('mytodoApp')
  .controller('MainCtrl', function ($scope, localStorageService) {
    //  breaks on repeat or blank input
    function addTodoFn() {
        $scope.todos.push($scope.todo); 
        $scope.todo = '';   
    }

    function removeTodoFn(index) {
        $scope.todos.splice(index, 1);
    }

    function watchFn() {
      localStorageService.set('todos', $scope.todos);
    }

    //////////

    var todosInStore = localStorageService.get('todos');
    $scope.todos = todosInStore || [];
    $scope.$watch('todos', watchFn, true);
    $scope.addTodo = addTodoFn;
    $scope.removeTodo = removeTodoFn;
  });

main.spec.js

describe('Controller: MainCtrl', function () {
  var MainCtrl;
  var scope;
  var store = [];
  var todo;
  var localStorage = { 
    addItem: function() {
      store.push(todo);
    }, 
    deleteItem: function(index) {
      store.splice(index, 1);
    }
  };

  beforeEach(function(){
    module('mytodoApp');
  });

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl as mc', {
      $scope: scope
    });

    // LocalStorage mock.
    spyOn(MainCtrl, 'addTodo').and.callFake(localStorage.addItem); <-- throwing the error
    spyOn(MainCtrl, 'removeTodo').and.callFake(localStorage.deleteItem);
  })); 

  afterEach(function() {
    store = [];
    todo = '';
  });

  it('should have no items to start with', function() {
    expect(store.length).toBe(0);
  });

  it('should add items to the list', function() {
    todo = 'a';
    scope.addTodo();
    expect(store.length).toBe(1);

    todo = 'b';
    scope.addTodo();
    expect(store.length).toBe(2);
  });
});

错误

PhantomJS 1.9.8 (Mac OS X 0.0.0) Controller: MainCtrl should add items to the list FAILED

Error: addTodo() method does not exist at /Users/Baggio/mytodo/test/spec/controllers/main.js:29

您正在监视 MainCtrladdTodo 方法。但是MainCtrl没有这样的方法。该方法在 scope 上,而不是在 MainCtrl.

顺便说一句,如果你监视范围,你的测试将测试任何东西:它只会测试 Jasmin 间谍是否做了它应该做的事情,而不是测试实际的 addTodo() 方法是否做了它应该做的事情.您应该监视或模拟的是控制器的 依赖项 ,即 localStorage 服务。