【问题标题】:AngularJS: Unit testing controller returns "TypeError: $scope.$watch is not a function"AngularJS:单元测试控制器返回“TypeError:$scope.$watch 不是函数”
【发布时间】:2016-08-11 08:18:58
【问题描述】:

我想为一个控制器写一个简单的测试

  • 将范围的变量设置为 ID
  • 调用触发 API 调用的函数,其 ID 位于范围内
  • 记录结果
    describe('The app', () => {

      beforeEach(angular.mock.module('myModule'));

      var $controller;
      var eId = 123456;

      beforeEach(angular.mock.inject((_$controller_) => {
          $controller = _$controller_;
      }));


      describe('directive', () => {
          it('should load the data from the api', () => {
              var scope = {};
              var controller = $controller('myController', { $scope: scope });
              scope.entityId = eId;
              expect(scope.entityId).toBe(eId);

              controller.load(); // API call using scope.entityId, to load some data into the scope
              scope.$digest();
              console.log("entities:", controller.entities); // Where the data should be loaded into
          });
      });
    });

我的控制器使用"controller as" 语法。

我的测试是用业力运行的,它给了我以下错误:

TypeError: $scope.$watch 不是函数 |在 myController.watchChanges

非常感谢任何正确方向的提示!

【问题讨论】:

    标签: angularjs unit-testing controller karma-jasmine


    【解决方案1】:

    你已经创建了一个scope 就像一个空对象,它是不正确的。您应该像 $rootScope 的新实例一样创建它。查看代码示例:

     describe('The app', () => {
    
        beforeEach(angular.mock.module('myModule'));
    
        var $controller, $rootScope;
        var eId = 123456;
    
        beforeEach(angular.mock.inject((_$controller_, _$rootScope_) => {
            $controller = _$controller_;
            $rootScope = _$rootScope_;
        }));
    
    
        describe('directive', () => {
            it('should load the data from the api', () => {
                var scope = $rootScope.$new();
                var controller = $controller('myController', { $scope: scope });
                scope.entityId = eId;
                expect(scope.entityId).toBe(eId);
    
                controller.load(); // API call using scope.entityId, to load some data into the scope
                scope.$digest();
                console.log("entities:", controller.entities); // Where the data should be loaded into
            });
        });
    });
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2014-04-12
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多