14

我在一个有调用的控制器中有一个函数

var someVar = angular.element(event.target).scope().field;

我试图通过这样做来模拟它

var ngElementFake = function(el) {
                return {
                    scope: function() {
                        return {
                            toggleChildElement: true,
                            field: scope.field
                        }
                    }
                }
            }

spyOn(angular, 'element').andCallFake(ngElementFake);

但是,当我在测试中调用该函数时,我得到了响应:

TypeError: 'undefined' is not a function (evaluating 'injector.get('$rootElement').off()')
at ../angular-mocks/angular-mocks.js:1819

我究竟做错了什么?

编辑:注入

    beforeEach(function() {
        inject(function($rootScope, $controller) {

            scope = $rootScope;

            scope.record = recordData;

            scope.model = 'Hierarchy';

            ctrl = $controller("fngHierarchyChildCtrl", {
                $scope: scope
            });
        });
    });
4

3 回答 3

18

我可以通过在回调后手动清除间谍来解决这个问题。

var spy;

beforeEach(function() {
    spy = spyOn(angular, 'element').andCallFake(ngElementFake);
});

afterEach(function() {
    spy.andCallThrough();
});
于 2015-07-07T00:36:54.057 回答
1

从 AngularJS常见问题解答

由于更改为使用 on()/off() 而不是 bind()/unbind(),Angular 1.2 只能在 jQuery 1.7.1 或更高版本上运行。

因此,尝试升级到 jquery 1.7.1 或更高版本,或者根本不使用 jquery,Angular 将使用自己的 jQLite。

于 2013-11-21T01:05:26.423 回答
0

从 angular 1.0.8 切换到 1.2.0 时,我在运行测试时遇到了以下错误:

TypeError: 'undefined' is not a function (evaluating 'injector.get('$rootElement').off()')

TypeError: 'undefined' is not a function (evaluating '$rootElement.on')

解决方案是编辑 karma 配置的文件部分并将 jQuery 移动到 angular 下方:

 files: [
  //was here
  'http://code.angularjs.org/1.2.0/angular.js',
  'http://code.angularjs.org/1.2.0/angular-mocks.js',
  'http://code.angularjs.org/1.2.0/angular-resource.js',
  'http://code.angularjs.org/1.2.0/angular-route.js',
  'http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js', //moved to here
  ...
 ]
于 2013-11-10T22:30:50.280 回答