$ scope存在于浏览器调试器上,但在终端中不存在

时间:2015-01-12 15:11:14

标签: javascript angularjs unit-testing scope jasmine

我有一个依赖于控制器的指令,该控制器通过Ajax调用从api获取数据。它工作正常。我试图使用jasmine测试它,奇怪的问题是,当我调试代码并检查一个值时,让我们说$scope.measurement它返回true,但是当我在终端中运行时它找不到{{ 1}}并引发错误$scope.measurement。不知道可能是什么问题。我认为问题可能在于隔离范围,但Expected undefined to be true没有函数element。有什么可以解决的问题吗?

这是控制器:

isolateScope()

这是指令:

'use strict';
angular.module('myApp')
  .controller('MeasurementsTimelineCtrl', ['$scope', 'Measurements', function($scope, Measurements) {
    $scope.measurements = null;
    var userId = $scope.currentUser ? $scope.currentUser.id : null;

    if (userId) {
      var listOfMeasurements = Measurements.users(userId);
      listOfMeasurements.then(function(data){
        $scope.measurements = data;
      });
    }
  });

这是测试:

'use strict';

angular.module('myApp')
  .directive('measurementTimeline', function() {
    return {
      restrict: 'E',
      templateUrl: 'myView.html',
      controller: 'MeasurementsTimelineCtrl',
      link: function(scope, element){
        scope.$on('measurements-updated', function(measurements) {
          _.defer(function(){
            if(measurements) {
              scope.measurementScroll = true;
            }
          });
        });
      }
    };
  }]);

2 个答案:

答案 0 :(得分:1)

怎么样?

it('should ......', function () {
  expect(element.scope().measurementScroll).toBe(true);
});

更新:

我认为您还需要在_.defer

上使用andCallThrough方法

spyOn(obj,'method')。andCallThrough()

答案 1 :(得分:0)

修改 似乎波纹管解决方案是一个“完美的错误案例”。然而,即使它们是错误的,测试通过它们也永远不会下降。

错误的解决方案 在改变以下内容后,测试通过了:

it('should ......', function () {
    scope.$evalAsync(function() {
      expect(scope.measurementScroll).toBe(true);
    });
  });

更新:正确解决方案

@Michal Charemza在this question中解决了这个问题的正确解决方案 - How to test _.defer() using Jasmine, AngularJs