【问题标题】:$scope.$apply undefined angularJS unit testing jasmine$scope.$apply 未定义的 angularJS 单元测试 jasmine
【发布时间】:2015-10-12 08:11:23
【问题描述】:

我正在测试一个包含

的控制器
$document.on('click', $scope.$apply.bind($scope, $scope.deactivate));

当我使用 Jasmine & Karma 测试这个控制器时

'use strict';

describe('controllers: ArrayCtrl', function() {
    var scope;

    beforeEach(module('ironridge'));

    beforeEach(inject(function($controller,$rootScope) {
        scope = $rootScope.$new();
            $controller('ArrayCtrl', {
                $scope: scope
            });  
        }));

    it('test section ', inject(function($controller) {
        expect(scope.pannels.length).toBe(0);
    }));

});

我收到以下错误:

PhantomJS 1.9.8 (Linux 0.0.0) 控制器:ArrayCtrl 应位于引用部分失败 TypeError: 'undefined' 不是函数(评估 '$scope.$apply.bind($scope, $scope.deactivate)') 不明确的 在/home/hpro/ironridge/src/app/components/array/array.controller.js:183 在调用 (/home/hpro/ironridge/bower_components/angular/angular.js:4219) 在实例化(/home/hpro/ironridge/bower_components/angular/angular.js:4227) 在/home/hpro/ironridge/bower_components/angular/angular.js:8533 在/home/hpro/ironridge/bower_components/angular-mocks/angular-mocks.js:1878 在/home/hpro/ironridge/src/app/components/array/array.controller.spec.js:11 在调用 (/home/hpro/ironridge/bower_components/angular/angular.js:4219) 在 workFn (/home/hpro/ironridge/bower_components/angular-mocks/angular-mocks.js:2437) TypeError:“未定义”不是对象(评估“scope.pannels.length”) 不明确的 在/home/hpro/ironridge/src/app/components/array/array.controller.spec.js:17 在调用 (/home/hpro/ironridge/bower_components/angular/angular.js:4219) 在 workFn (/home/hpro/ironridge/bower_components/angular-mocks/angular-mocks.js:2437)

请帮忙

【问题讨论】:

标签: javascript angularjs angularjs-scope karma-jasmine


【解决方案1】:
$document.on('click', $scope.$apply.bind($scope, $scope.deactivate));

我认为上面的代码不起作用。我猜您正在尝试应用范围。你可以这样做

    $(document).on('click', function(){
        if(!$scope.$$phase){
            $scope.$apply();
        }
        $scope.deactivate();
   });

来到测试用例,AngularJs中的bind函数用作

angular.bind(self, fn, args)

根据documentation。在 JQuery 中,bind 用于将处理程序附加到元素的事件。在任何情况下 $scope.$apply.bind 都不起作用。这就是您的测试用例抛出错误的原因。

【讨论】:

  • 感谢我测试过的答案 $(document).on('click', function(){ if(!$scope.$$phase){ $scope.$apply(); } $scope.deactivate(); });但是当我双击时执行的操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2017-08-19
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
相关资源
最近更新 更多