Javascript 角度测试控制器导致TypeError:Object没有方法“$watch”

Javascript 角度测试控制器导致TypeError:Object没有方法“$watch”,javascript,unit-testing,angularjs,karma-runner,karma-jasmine,Javascript,Unit Testing,Angularjs,Karma Runner,Karma Jasmine,我正在测试我的控制器, 当我运行测试时,我得到: TypeError:对象没有方法“$watch” 在我的控制器中,我使用$scope.$watch,如何解决此问题 controllerSpecs.js controller.js: 错误: 您的应用程序模块称为控制器吗?你为你的ng应用分配了什么 您的应用程序模块称为控制器吗?您为ng应用程序分配了什么?您正在将作用域初始化为{}。所以,$scope是{},没有任何角度方法。只需删除beforeach$controller调用中的scope属性

我正在测试我的控制器, 当我运行测试时,我得到:

TypeError:对象没有方法“$watch”

在我的控制器中,我使用$scope.$watch,如何解决此问题

controllerSpecs.js

controller.js:

错误:

您的应用程序模块称为控制器吗?你为你的ng应用分配了什么


您的应用程序模块称为控制器吗?您为ng应用程序分配了什么?

您正在将作用域初始化为{}。所以,$scope是{},没有任何角度方法。只需删除beforeach$controller调用中的scope属性。@Utopik谢谢,现在我得到了不同的错误,TypeError:无法设置控制器$scope.number=3中未定义的属性'number',但现在作用域未定义。您正在将作用域初始化为{}。所以,$scope是{},没有任何角度方法。只需删除beforeach$controller调用中的scope属性即可。@Utopik谢谢,现在我得到了不同的错误,TypeError:无法设置控制器$scope.number=3中未定义的属性'number',但现在范围未定义。如果成功了,但现在我得到了一个错误,因为我正在从我的原始控制器类型调用另一个方法错误:对象没有方法“get\u publisher\u list”我更新了控制器代码,你能帮忙吗?我想你应该为这个问题提出另一个问题,因为这已经解决了原来的问题。让我们试着不要偏离这个答案,我的答案可能会对其他人有所帮助。或者我们可以把这个移到聊天@LiadLivNat我认为您需要单独测试服务。看看这个请看其他线程完善它的工作,但现在我得到了一个错误,因为我调用了另一个方法从我的原始控制器类型错误:对象没有方法'得到出版商名单'我更新了控制器代码,你能帮我吗?我想你应该为这个问题提出另一个问题,因为这已经解决了原来的问题。让我们试着不要偏离这个答案,我的答案可能会对其他人有所帮助。或者我们可以把这个移到聊天@LiadLivNat我认为您需要单独测试服务。看这个,请看另一条线
describe('controllers', function(){
    var scope, ctrl,timeout;
    beforeEach(module('controllers'));
    beforeEach(inject(function($controller) {
        scope = {};
        timeout = {};
        ctrl = $controller('PublishersCtrl', {$scope:scope,APIService:APIService,$timeout:timeout});
    }));

    it('should have scope variable equals number', function() {
      expect(scope.number).toBe(3);
    });
});
controller('PublishersCtrl',['$scope','APIService','$timeout',  function($scope,APIService,$timeout) {
    $scope.number = 3;
     /* Make sure second click on order will revert the sorting */
    $scope.$watch('orderByField', function() {
        $scope.reverseSort = true;
    }); // initialize the watch

    APIService.get_publisher_list().then(function(data){
        $scope.render_table_and_filters(data);
    });
}
  TypeError: Object #<Object> has no method '$watch'
       at new <anonymous> (C:/angular-client/app/js/controllers.js:24:12)
describe('controllers', function(){
    var scope, ctrl, timeout;
    beforeEach(module('controllers'));
    beforeEach(inject(function($rootScope, $controller) {
        scope = $rootScope.$new(); // this is what you missed out
        timeout = {};
        controller = $controller('PublishersCtrl', {
            $scope: scope,
            APIService: APIService,
            $timeout: timeout
        });
    }));

    it('should have scope variable equals number', function() {
      expect(scope.number).toBe(3);
    });
});