gpt4 book ai didi

javascript - 在测试中 AngularJS 中的 Controller 初始化时调用模拟操作

转载 作者:行者123 更新时间:2023-11-29 18:21:34 25 4
gpt4 key购买 nike

我有一个基本如下所示的 angularjs Controller

app.controller('MyCtrl', function($scope, service) {

$scope.positions = service.loadPositions(); // this calls $http internally

$scope.save = function() {
...
};

// other $scope functions here

});

现在每次我为 $scope 中的任何方法编写测试时,我都需要 stub service.loadPositions() 如下所示:

  it(should 'save modified position', function($controller, service, $rootScope) {
spyOn(service, 'loadPositions').andReturn(fakeData);

var scope = $rootScope.$new();
$controller('MyCtrl', {$scope: scope});

// test stuff here
})

有什么方法可以避免在每次测试中出现第一次 stub 问题吗?我的意思是,如果我已经测试过这个 Action 是在 Controller 启动时调用的,那么我真的不需要在接下来的每个测试中都对它进行 stub 。这会在每个测试中引入大量重复。

编辑

我偶然发现了 ngInit,我认为我可以使用它,但似乎不推荐这样做,但我不确定为什么?

最佳答案

describe 函数中使用 beforeEach:

describe('My test', function() {
var $controller,
$rootScope,
serviceMock;

beforeEach(function() {
serviceMock = { loadPositions: function() {} };
spyOn(serviceMock, 'loadPositions').andReturn(fakeData);

inject(_$controller_, _$rootScope_) {
$rootScope = _$rootScope_.$new();
$controller = _$controller_('MyCtrl',
{$scope: $rootScope, service: serviceMock});
};
});

it('should save modified position', function() {
// test stuff here
});
});

请注意,我也已将 Controller 初始化移至 beforeEach,这样您就不必在每次测试中都重新进行。

以防万一你想知道 inject 参数中的下划线是干什么用的,它们使测试能够声明一个本地 $controller 变量和一个本地 $rootScope 变量。 Angular 在解析函数依赖时会忽略它们。

更新:示例代码中有一个小错误。刚刚修复它。

关于javascript - 在测试中 AngularJS 中的 Controller 初始化时调用模拟操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com