【问题标题】:Jasmine gives TypeError on $scope.$onJasmine 在 $scope.$on 上给出 TypeError
【发布时间】:2017-04-20 04:32:25
【问题描述】:

我正在使用 Jasmine/Karma 测试 Angularjs 代码,而且我是 Jasmine 的新手。我使用expect(true).toEqual(true) 进行了基本测试,该测试有效,因此设置似乎还可以。一旦我尝试测试实际使用控制器的东西,我会得到以下信息:

TypeError: undefined is not a function(评估 '$scope.$on('myEvent', function(event,data)

我有几个 $scope.$on 方法,它们的顺序无关紧要,它抱怨第一个。以下是如何设置控制器的摘录:

angular.module('myProject.dataType')
.controller('DataTypeController', ['$scope', '$state', '$rootScope', function($scope, $state, $rootScope) {
   $scope.dataTypeId="";
...other stuff...
   $scope.$on('myEvent', function(event, data) {
      $scope.dataTypeId =  "";
   });
}]);

这是我的规范文件:

describe("Data Type Controller', function() {
   beforeEach(module('myProject.dataType') );
   var $controller;

   beforeEach(inject(function(_$controller_) {
      $controller = _$controller_;
   }));

   describe('Create type', function() {
      it('basic test', function() {
        var $scope = {};
        var controller = $controller('DataTypeController', {'$scope': $scope});
        expect(true).toEqual(true);
      });
   });
});

请注意,实际代码(不是 Jasmine)可以正常工作。如果我注释掉“var controller...”行,则测试通过。在这一点上,我实际上并没有尝试调用任何东西,所以我不确定它为什么会碰到$scope.$on,更不用说失败了。我最好的猜测是我在规范文件中设置范围的方式有问题。

我检查了文件版本(基于对类似问题的回答),并尽我所能确保没有错别字或粗手指。非常感谢任何帮助。

【问题讨论】:

    标签: javascript angularjs jasmine


    【解决方案1】:

    我相信您还需要将作用域注入到您的 beforeEach fn 中,而不是将其定义为空对象。现在你的 $scope 实际上是一个空对象,所以方法 '$on' 不存在于测试的上下文中。

    用途:

    beforeEach(inject(function(_$controller_, _$rootScope_) {
          $controller = _$controller_;
          $scope = _$rootScope_.$new();
       }));
    

    【讨论】:

    • 我之前尝试过,但我认为我使用的是 $rootScope 而不是 $rootScope。这行得通。谢谢吨!
    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多