AngularJS Jasmine 测试初始化函数
AngularJS Jasmine testing init functions
我正在尝试从我的控制器的初始化函数中测试函数调用。我根据 stateParams 路由各种逻辑,并想针对这种情况编写单元测试,但我无法使其正常工作。
我的初始化函数
var _init = function () {
// Get full companyList
servicecall().then(function (response) {
if ($stateParams.ID) {
$scope.callOne();
}
else if ($stateParams.Index == -1) {
$scope.callTwo();
}
else if ($stateParams.Index == '' || $stateParams.Index == null) {
$scope.callThree();
}
else
$scope.callFour();
},
function (err) {
console.log(err);
});
};
_init();
所以我只想设置 $stateParams.Index = -1,并确保 callTwo() 被调用。
我的beforeEach看起来像
beforeEach(function () {
controller = $controller('Controller', {
$scope: $scope,
$stateParams: $stateParams,
$state: $state
});
// And add $scope's spyOns
spyOn($scope, 'callOne').and.callThrough();
spyOn($scope, 'callTwo').and.callThrough();
spyOn($scope, 'callThree').and.callThrough();
spyOn($scope, 'callFour').and.callThrough();
});
起初我尝试了下面的方法,当然没有用;它说没有调用间谍。
it("should call callTwo if stateParams.index is -1", function () {
$stateParams.Index = -1;
expect($scope.callTwo()).toHaveBeenCalled();
});
我认为所有初始化都发生在我的间谍连接之前,所以我尝试将这些东西移到我的 it 调用中,但一切都崩溃了。
这个说 callTwo 已经被监视了。
it("should call callTwo if stateParams is -1", function () {
$stateParams.Index = -1;
spyOn($scope, 'callTwo').and.callThrough();
controller = $controller('Controller', {
$scope: $scope,
$stateParams: $stateParams,
$state: $state
});
expect($scope.callTwo).toHaveBeenCalled();
});
但是如果我在控制器初始化后移动间谍声明,它会说它不会再次调用
- 如何确保在控制器实例化期间按预期进行调用?
不确定这是否是最佳解决方案,但目前没有想到其他解决方案,这绝对有效。
您可以为每个此类测试设置一个 describe
,因为 $stateParams
是在您创建控制器时注入的。这就是为什么在 it
中这样做是不够的,因为当时的 $scope
属于已经创建的控制器。
所以你需要:
describe('Controller tests for when Index === -1', function () {
beforeEach(function (...) {
$stateParams.Index = -1;
controller = $controller('Controller', {
$scope: $scope,
$stateParams: $stateParams,
$state: $state
});
}
// it tests for Index === -1 case
});
所以在这个例子中,你将要进行的所有 it
测试都保证有 $stateParams === 1
。同样适用于您的其他价值观。
我正在尝试从我的控制器的初始化函数中测试函数调用。我根据 stateParams 路由各种逻辑,并想针对这种情况编写单元测试,但我无法使其正常工作。
我的初始化函数
var _init = function () {
// Get full companyList
servicecall().then(function (response) {
if ($stateParams.ID) {
$scope.callOne();
}
else if ($stateParams.Index == -1) {
$scope.callTwo();
}
else if ($stateParams.Index == '' || $stateParams.Index == null) {
$scope.callThree();
}
else
$scope.callFour();
},
function (err) {
console.log(err);
});
};
_init();
所以我只想设置 $stateParams.Index = -1,并确保 callTwo() 被调用。
我的beforeEach看起来像
beforeEach(function () {
controller = $controller('Controller', {
$scope: $scope,
$stateParams: $stateParams,
$state: $state
});
// And add $scope's spyOns
spyOn($scope, 'callOne').and.callThrough();
spyOn($scope, 'callTwo').and.callThrough();
spyOn($scope, 'callThree').and.callThrough();
spyOn($scope, 'callFour').and.callThrough();
});
起初我尝试了下面的方法,当然没有用;它说没有调用间谍。
it("should call callTwo if stateParams.index is -1", function () {
$stateParams.Index = -1;
expect($scope.callTwo()).toHaveBeenCalled();
});
我认为所有初始化都发生在我的间谍连接之前,所以我尝试将这些东西移到我的 it 调用中,但一切都崩溃了。
这个说 callTwo 已经被监视了。
it("should call callTwo if stateParams is -1", function () {
$stateParams.Index = -1;
spyOn($scope, 'callTwo').and.callThrough();
controller = $controller('Controller', {
$scope: $scope,
$stateParams: $stateParams,
$state: $state
});
expect($scope.callTwo).toHaveBeenCalled();
});
但是如果我在控制器初始化后移动间谍声明,它会说它不会再次调用
- 如何确保在控制器实例化期间按预期进行调用?
不确定这是否是最佳解决方案,但目前没有想到其他解决方案,这绝对有效。
您可以为每个此类测试设置一个 describe
,因为 $stateParams
是在您创建控制器时注入的。这就是为什么在 it
中这样做是不够的,因为当时的 $scope
属于已经创建的控制器。
所以你需要:
describe('Controller tests for when Index === -1', function () {
beforeEach(function (...) {
$stateParams.Index = -1;
controller = $controller('Controller', {
$scope: $scope,
$stateParams: $stateParams,
$state: $state
});
}
// it tests for Index === -1 case
});
所以在这个例子中,你将要进行的所有 it
测试都保证有 $stateParams === 1
。同样适用于您的其他价值观。