我的 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 吗?我的意思是,如果我已经测试过在 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/