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

$scope exists on browser debugger, but does not exist in terminal

我有一个依赖于控制器的指令,该控制器从 api though Ajax 调用中获取数据。它工作正常。我正在尝试使用 jasmine 对其进行测试,奇怪的问题是,当我调试代码并检查 $scope.measurement 的值时,它 returns 是真的,但是当我 运行 在终端找不到 $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;
            }
          });
        });
      }
    };
  }]);

这是测试:

   'use strict';

    describe('Directive: measurementTimeline', function () {

      var $rootScope, $compile, element, scope, createController, $httpBackend, apiUrl;

      beforeEach(function() {
        module('myApp');

        inject(function($injector) {
          $rootScope = $injector.get('$rootScope');
          $compile = $injector.get('$compile');
          $httpBackend = $injector.get('$httpBackend');
          apiUrl = $injector.get('apiUrl');
        });
        scope = $rootScope.$new();
        element = angular.element('<dashboard-measurement-timeline></dashboard-measurement-timeline>');
        element = $compile(element)(scope);

        scope.$digest();
        scope.measurements = [{id: 'someId', time_of_test: 'Tue, 30 Dec 2014 14:00:00 -0000'},
          {id: 'someId', time_of_test: 'Fri, 13 Jun 2014 14:00:00 -0000'}];

        scope.$broadcast('measurements-updated', scope.measurements);
        scope.$apply();
      });

      describe('PUser', function(){
        beforeEach(function(){
          scope.currentUser = null;
        });

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

怎么样?

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

更新:

而且我认为您还需要在 _.defer

上使用和 CallThrough 方法

spyOn(obj, 'method').和 CallThrough()

编辑 似乎下面的解决方案是 "Perfect wrong case"。然而,测试通过了,它们永远不会失败,即使它们是错误的。

错误的解决方案 修改以下内容后测试通过:

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

更新:正确的解决方案

@Michal Charemza 在 中解决了这个问题的正确解决方案 -