修改角度控制器单元测试的$ scope值

rdo*_*dev 7 unit-testing angularjs karma-runner

所有,

我有一个AngularJS控制器的单元测试套件,它遵循以下模式beforeEach():

var ResourcesCtrl,
    scope, rootScope, loc, ctrl;

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $location) {
    scope = {};
    rootScope = {};
    loc = $location;
    ctrl = $controller;
    scope.instanceName = 'TestInstance';


    ResourcesCtrl = $controller('ResourcesCtrl', {
      $scope: scope,
      $rootScope: rootScope,
      $location: loc
    });
  }));
Run Code Online (Sandbox Code Playgroud)

然后是一堆it()带有断言的块/期望所有块都按预期工作.

现在我需要做的是,在我添加的一个测试用例中,改变了值scope.instanceName; 但是,看起来即使我在it()测试用例中更改了它的值,也没有反映在控制器的范围内.我已经尝试在测试用例中使用新范围实例化控制器,但这也没有用.

所以我的问题如下:如何更改/覆盖在beforeEach()设置中传递给控制器​​的变量?

ale*_*rd1 5

这里的问题是调用$controller发生在beforeEach中,使用当时可用的任何范围变量.您希望能够调用控制器之前更改scope变量.一种选择是使用在每个规范中调用的函数,以便您可以精确控制控制器何时被调用:init

beforeEach(inject(function ($controller, $location) {
  scope = {};
  rootScope = {};
  loc = $location;
  ctrl = $controller;
  scope.instanceName = 'TestInstance';

  this.init = function() {
    ResourcesCtrl = $controller('ResourcesCtrl', {
      $scope: scope,
      $rootScope: rootScope,
      $location: loc
    });
  }
}));

...

it("should do something", function() {
  scope.instanceName = "NewName";
  this.init();
  ...
});
Run Code Online (Sandbox Code Playgroud)

请注意,这意味着this.init必须在文件中的每个规范中调用.