2016-03-29 32 views
4

我有一个简单的指令链接函数,它检查窗口调整大小和调用一个函数下面的代码。

return { 
    restrict: 'A', 
    link: function (scope) { 
     angular.element($window).on('resize', function() { 
      scope.getSize(); 
     }); 

     scope.getSize() = function() { 
      return true; 
     }; 
    } 
} 

我试图在($window).on('resize')测试scope.getSize()被调用。

在我的测试中,我编译我的指令,像这样:

beforeEach(inject(function($rootScope, $compile, _$window_) { 
    $window = _$window_; 
    $scope = $rootScope.$new(); 
    element = angular.element('<div data-watch-resize></div>'); 
    element = $compile(element)($scope); 
    $scope.$digest(); 
})); 

我再窥视窗口的缩放功能,并期望已调用的函数

spyOn($window, 'resize'); 
$window.innerWidth = 1026; 
$scope.$digest(); 
expect(element.scope().getSize()).toHaveBeenCalled(); 

但是我得到的以下错误

Error: resize() method does not exist

我不会再盟友肯定为什么它不存在,有什么明显的我做错了吗?

+0

ü可能需要创建一个大小调整方法的假功能,因为它是一个DOM方法。 –

+0

我试过做'spyOn($ window,'resize')。和.callFake(function(){do something});'但这似乎不起作用,或者 – gardni

+0

也许尝试更改$ window。 innerWidth两次,所以实际上有一个调整大小的动作? –

回答

6

如果有人被卡住的类似的东西:

it('should expect scope.getSize() to have been called on window resize', function() { 
    spyOn(element.isolateScope(), 'getSize'); 
    $window.innerWidth = 1026; 
    angular.element($window).triggerHandler('resize'); 
    $scope.$digest(); 
    expect(element.isolateScope().getSize).toHaveBeenCalled(); 
}); 
+0

谢谢。我有一个几乎相同的指令和测试配置,但我收到此错误:'找不到一个对象来查询getSize()'你有没有遇到过这种情况? – isherwood

+0

@isherwood会建议你打电话不存在吗?上面的等价物是element.isolateScope()不存在 – gardni

+0

我从来没有让间谍工作过,但是我通过删除间谍并简单地检查编译后期望的类更改来解决它。 – isherwood