如何窥探一个功能?

时间:2015-04-13 03:49:19

标签: angularjs unit-testing jasmine karma-jasmine

我的指令看起来像这样:

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

        }
    };
}]);

spyOnadjustTop()时,我如何MyConfig.adjusttop检测true功能?

1 个答案:

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

Working Plunker