我的指令看起来像这样:
angular.module('myApp', [])
.directive('myDirective', ['$window','MyConfig', function($window,MyConfig){
return {
link: function(scope, element, attr, controller) {
var w = angular.element($window);
function adjustTop(){
var oldtop = scope.top;
if(oldtop<15){
scope.top += 2;
}else{
scope.top = 0;
}
}
if(MyConfig.adjusttop){
w.bind('scroll', function () {
adjustTop();
});
};
}
};
}]);
当spyOn
为adjustTop()
时,我如何MyConfig.adjusttop
检测true
功能?
答案 0 :(得分:0)
你不应该这样做。对私人成员进行测试可能并不是一个好主意,因为它将您的测试与特定实现相结合,使其变得脆弱。
一般情况下,您应该测试代码执行的内容,而不是 的执行方式。在这种情况下,您可以编写测试以确保在scope.top
事件被触发后正确更新scroll
属性。
已更新,以解决OP的评论:
这是一种测试你想要的方式:
describe('my test', function() {
var $scope, $window, $compile, MyConfigMock;
beforeEach(function() {
module('plunker');
MyConfigMock = {};
module(function($provide) {
$provide.value('MyConfig', MyConfigMock);
});
inject(function($rootScope, _$window_, _$compile_) {
$scope = $rootScope;
$window = _$window_;
$compile = _$compile_;
});
});
it('updates top on scroll if set to do so', function() {
// Arrange
MyConfigMock.adjusttop = true;
$scope.top = 15;
$compile('<my-directive></my-directive>')($scope);
// Act
$($window).trigger('scroll');
// Assert
expect($scope.top).toBe(0);
});
});