【发布时间】:2014-10-10 18:27:31
【问题描述】:
我想在依赖于异步 API 调用(承诺)的 Angular 控制器中对一个函数进行单元测试。
我在控制器中有一个函数,它调用服务并根据服务的结果在控制器中设置 $scope 变量:
$scope.display = 'loading';
$scope.loadData = function() {
ApiService.getSummary().then(
function (response) {
$scope.displayData(response.data);
$scope.display = 'boxes';
},
function (error) {
$scope.display = 'error';
}
);
};
我有以下 Jasmine 单元测试
var FunctionFixtures = {
successFunc: function() {
var deferred = $q.defer();
var response = {
'data': dataVar
};
deferred.resolve(response);
return deferred.promise;
},
errorFunc: function() {
var deferred = $q.defer();
deferred.reject();
return deferred.promise;
}
};
it('should show the boxes on data load success', function(){
spyOn(ApiService, 'getSummary').and.callFake(FunctionFixtures.successFunc);
$scope.loadData();
expect($scope.display).toBe('boxes');
});
当我运行测试时,我收到以下错误:
Error: Expected 'loading' to be 'boxes'.
我本质上想伪造 api 调用并返回成功或失败,并确保 $scope.display 设置为适当的字符串,即“boxes”表示成功,“error”失败。关于如何做到这一点的任何想法?
【问题讨论】:
-
你的测试中是否缺少
$scope.loadData()!? -
不,抱歉@friedi,我只是省略了在测试中调用 $scope.loadData() 的那一行。我在这里简化了代码,使其更通用。
标签: javascript angularjs unit-testing jasmine karma-jasmine