javascript - Jasmine 在 $scope.$on 上给出 TypeError

标签 javascript angularjs jasmine

我正在使用 Jasmine/Karma 来测试 Angularjs 代码,而且我对 Jasmine 是全新的。我使用 expect(true).toEqual(true) 进行了基本测试,该测试有效,因此看起来设置没问题。一旦我尝试测试实际使用 Controller 的东西,我就会得到以下结果:

类型错误:未定义不是函数(评估 '$scope.$on('myEvent', function(event,data)

我有几个 $scope.$on 方法,无论它们的顺序如何,它都会提示第一个方法。以下是 Controller 设置方式的摘录:

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)工作得很好。如果我注释掉“varcontroller...”行,测试就会通过。此时我实际上并没有尝试调用任何东西,所以我不确定为什么它会命中 $scope.$on,更不用说失败了。我最好的猜测是我在规范文件中设置范围的方式有问题。

我已经检查了文件版本(基于对类似问题的回答),并尽力确保不存在拼写错误或粗手指。非常感谢任何帮助。

最佳答案

我相信您还需要将范围注入(inject)到 beforeEach fn 中,而不是将其定义为空对象。现在,您的 $scope 实际上是一个空对象,因此测试上下文中不存在方法“$on”。

用途:

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

关于javascript - Jasmine 在 $scope.$on 上给出 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504861/

相关文章:

javascript - Angular 2 JWT 单元测试

javascript - 无法读取未定义的 Angular 4 的属性 '' - 单元测试

javascript - 防止同一请求多次完成

javascript - 只是尝试检查该值是否存在于数组中

javascript - 参数化函数

Firefox 和 IE9 中的 Javascript 事件

javascript - 从选定的记录设置下拉列表的值

javascript - Highcharts 同时收集 JSON 并通过修改 pointstart 更改日期

javascript - 混合使用 ES6 Promise 和 JQuery Promise

javascript - 如何解决 Protractor 测试无限期挂起的问题?