了解Jasmine测试中的$ controller

时间:2015-07-12 18:57:51

标签: angularjs jasmine

我对Jasmine很新。我阅读了一个包含以下代码的教程:

angular.module('moduleX', []).controller('HomeCtrl',function($scope) {
  $scope.showData = function(data) {
    $scope.$broadcast('showData', data);
  };
});

以下是测试:

beforeEach(inject(function ($rootScope, $controller) {
   scope = $rootScope.$new();
   $controller('HomeCtrl', {
      $scope: scope
   });
   spyOn(scope, '$broadcast');
}));

it('should call $broadcast', function() {
    scope.showData();
    expect(scope.$broadcast).toHaveBeenCalled();
});

我的问题是一切如何运作? if scope = $ rootScope。$ new();然后我假设范围变成一个全新的空范围,并且范围上没有showData方法,那么scope.showData()如何工作?我认为$ controller只能帮助实例化一个新的HomeCtrl,但它没有分配给任何变量(我希望看到像var homeCtrl = $controller('HomeCtrl', {$scope: scope});之类的东西)我不确定它是否与范围变量有关情况?

一些注释:我制作一些console.log来查看范围变量:

  scope = $rootScope.$new();
  console.log("scope before",scope)
  $controller('HomeCtrl', {
    $scope: scope
  });
  console.log("scope after",scope)

我可以看到现在"之后的"范围内有showData,所以$ controller已经修改了原始范围变量。我不确定为什么,并认为这种方式不直观。

1 个答案:

答案 0 :(得分:0)

  

$ controller service负责实例化控制器。   https://docs.angularjs.org/api/ng/service/ $控制器

在第一个代码示例中,您创建了控制器,它需要$ scope作为依赖项,并将函数showData创建为$ scope属性。

在之前创建每个新的空范围并调用下一个$ controller服务 - 这意味着 创建我' HomeCtrl' instance和$ scope参数由作用域传递(在前一行创建的新空作用域)

在控制器实例化中,调用控制器构造函数,将方法showData添加为$ scope属性。

顺便说一句,更好的解决方案是使用controllerAs语法,因为那时控制器是标准的JS构造函数,其方法就是这个而不是$ scope(例如this.showData)