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

Angularjs 修改角度控制器单元测试的$scope值,angularjs,unit-testing,karma-runner,Angularjs,Unit Testing,Karma Runner,全部, 我有一个AngularJS控制器的单元测试套件,它遵循模式beforeach(): 然后,一堆it()用断言/预期阻塞,所有这些都按预期工作 现在我需要做的是,在我正在添加的一个测试用例中,更改scope.instanceName的值;然而,即使我在it()测试用例中更改了它的值,这似乎也不会反映在控制器的范围中。我试着在测试用例中用一个新的作用域实例化控制器,但这也不起作用 因此,我的问题是:如何更改/覆盖在beforeach()设置中传递给控制器的变量?这里的问题是,调用$contr

全部,

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

然后,一堆
it()
用断言/预期阻塞,所有这些都按预期工作

现在我需要做的是,在我正在添加的一个测试用例中,更改
scope.instanceName的值;然而,即使我在
it()
测试用例中更改了它的值,这似乎也不会反映在控制器的范围中。我试着在测试用例中用一个新的作用域实例化控制器,但这也不起作用


因此,我的问题是:如何更改/覆盖在
beforeach()
设置中传递给控制器的变量?

这里的问题是,调用
$controller
时,在beforeach中使用当时可用的任何作用域变量。您希望能够在调用控制器之前更改
范围
变量。一个选项是使用在每个规范中调用的
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();
  ...
});

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

在beforeach中,将$rootScope添加到参数列表中,并像这样分配以下变量

scope = $rootScope.$new();
rootScope = $rootScope;

由于它们来自angular的$rootScope,如果需要,您可以调用$apply()。

我想避免在每个规范中调用东西,但是,似乎做到了这一点。谢谢。在每个规范中使用
init
函数的另一种方法是使用
descripe
块分组在一起。如果在控制器内设置值,并且希望将其覆盖为新值,这是否有效?我试图像您的示例中那样重写该值,但当控制器初始化时,它会将其更改回原始值。@AronYsidoro在这种情况下,您必须在控制器运行后修改范围。如果您正在测试控制器添加到作用域中的方法,那么应该可以正常工作。运行控制器、更改值、运行方法并检查返回值。如果您正在测试控制器的其他方面,可能会变得很棘手,这取决于您正在做什么。
scope = $rootScope.$new();
rootScope = $rootScope;