2013-10-18 151 views
14

我有一個功能具有呼叫模擬出angular.element測試

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 
      }); 
     }); 
    }); 

回答

0

當從角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') 

的解決方案是編輯文件部分業務配置和移動jQuery以下角度:

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 
    ... 
] 
1

從AngularJS FAQ

由於改變爲使用()/關閉(),而不是綁定()/解除綁定(),角1.2僅與jQuery 1.7.1或以上操作。

因此,請嘗試升級到jquery 1.7.1或更高版本或根本不使用jquery,angular會使用自己的jQLite。

16

我能夠通過在回調後手動清除間諜來解決這個問題。

var spy; 

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

afterEach(function() { 
    spy.andCallThrough(); 
}); 
+0

好的。適用於我 – ganta

+0

重要的一行是'spy.andCallThrough();' – Daniel