我想在一个依赖于异步API调用(一个promise)的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设置为适当的字符串,即成功和“错误”失败的“框”。有关如何做到这一点的任何想法?
答案 0 :(得分:0)
在$rootScope.apply()
来电之后但在致电loadData()
之前,您似乎错过了对expect
的来电。
由于Angular承诺与$rootScope
的集成方式,您需要为已解决的承诺运行一个摘要周期来调用其回调,如https://code.angularjs.org/1.2.26/docs/api/ng/service/ $ q#testing所示。