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