简体   繁体   English

为什么在我的AngularJS / Karma单元测试中找不到$ scope?

[英]Why won't $scope be found in my AngularJS / Karma unit test?

My controller: 我的控制器:

angularMoonApp.controller('SourceController', ['$scope', '$rootScope', '$routeParams', 'fileService', function ($scope, $rootScope, $routeParams, fileService) {
  $scope.init = function() {
    $rootScope.currentItem = 'source';

    fileService.getContents($routeParams.path).then(function(response) {
      $scope.contents = response.data;
      $scope.fileContents = null;
      if(_.isArray($scope.contents)) {
        // We have a listing of files
        $scope.breadcrumbPath = response.data[0].path.split('/'); 
      } else {
        // We have one file
        $scope.breadcrumbPath = response.data.path.split('/');
        $scope.breadcrumbPath.push('');

        $scope.fileContents = atob(response.data.content);

        fileService.getCommits(response.data.path).then(function(response) {
          $scope.commits = response.data;
        });
      }
    });
  }

  $scope.init();
}]);

My unit test: 我的单元测试:

(function() {
  describe('SourceController', function() {
    var $scope, $rootScope, $httpBackend, $routeParams, $q, createController, fileService, deferred;

    beforeEach(module('angularMoon'));

    beforeEach(inject(function($injector) {
      $httpBackend = $injector.get('$httpBackend');
      $rootScope = $injector.get('$rootScope');
      $routeParams = $injector.get('$routeParams');
      $scope = $rootScope.$new();
      $q = $injector.get('$q');
      deferred = $q.defer();

      fileService = $injector.get('fileService');
      var $controller = $injector.get('$controller');

      createController = function() {
        return $controller('SourceController', {
          '$scope': $scope,
          '$routeParams': $routeParams,
          'fileService': fileService
        });
      };
    }));

    it("should set the current menu item to 'source'", function() {
      createController();
      $scope.init();
      expect($rootScope.currentItem).toBe('source');
    });

    it("should get test the getContents call of the fileService", function() {
      spyOn(fileService, 'getContents').andCallThrough();
      createController();
      $scope.init();

      expect(fileService.getContents).toHaveBeenCalled();
    });

    it("should return an object with multiple files", function() {
      var multipleFiles = [{path: '.DS_Store'}, {path: '.bowerrc'}];
      deferred.resolve(multipleFiles);
      spyOn(fileService, 'getContents').andReturn(deferred.promise);

      createController();
      $scope.init();

      expect($scope.contents).toBe(multipleFiles);
      expect($scope.breadcrumbPath).toBe('');
    });
  });
})();

The last test fails with: 上一个测试失败,并显示:

Expected undefined to be [ { path : '.DS_Store' }, { path : '.bowerrc' } ].
Expected undefined to be ''.

Why is the $scope undefined here? 为什么在这里未定义$scope

Your controller is expecting you to inject in $rootScope which you are not doing in your unit test. 您的控制器希望您注入$ rootScope,而您在单元测试中没有这样做。

You have: 你有:

  createController = function() {
    return $controller('SourceController', {
      '$scope': $scope,
      '$routeParams': $routeParams,
      'fileService': fileService
    });

But but should have: 但应具有:

  createController = function() {
    return $controller('SourceController', {
      '$scope': $scope,
      '$rootScope': $rootScope,
      '$routeParams': $routeParams,
      'fileService': fileService
    });

Also, you will want to call this code: 另外,您将需要调用以下代码:

createController();
$scope.init();

before you resolve your promise: 在兑现诺言之前:

deferred.resolve(multipleFiles);

The scope is not undefined. 范围不是不确定的。 What is undefined is $scope.contents and $scope.breadcrumbPath . 未定义的是$scope.contents$scope.breadcrumbPath

And that's because promise callbacks are always being called asynchronously. 那是因为promise回调总是被异步调用。 You need to call 你需要打电话

$scope.$apply()

before verifying your expectations. 在验证您的期望之前。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM