如何在Jasmine中对依赖服务的函数进行单元测试
How do I unit test a service-dependent function in Jasmine?
我想在一个依赖于异步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';
}
);
};
我有以下茉莉花单元测试
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"表示失败。有什么想法吗?
在对loadData()
的调用之后,但在对expect
的调用之前,似乎缺少对$rootScope.apply()
的调用。
由于Angular promise是如何和$rootScope
集成的,您需要为已解析的promise运行一个摘要循环来调用它们的回调,如https://code.angularjs.org/1.2.26/docs/api/ng/service/$q#测试。
相关文章:
- AngularJS指令单元测试中未定义的函数
- 如何在JavaScript中对箭头函数进行单元测试
- 在http服务单元测试中使用request-js时,chai.request不是一个函数
- 如何对调用getJSON的javascript函数进行单元测试
- AngluarJS单元测试-未定义不是函数
- 因果报应单元测试'未定义'不是函数错误
- 没有返回类型的函数的Javascript单元测试
- 在对揭示模块进行单元测试时,如何存根私有函数
- 如何对延迟函数执行单元测试
- jquery中的单元测试函数
- 如何使用 express、猫鼬和节点单元测试异步函数
- 对函数的参数(即函数)进行单元测试
- 连接到数据库的单元测试异步函数
- AngularJS私有函数单元测试混乱
- 模块中的单元测试函数
- 如何对传递给JavaScript函数的匿名回调进行单元测试
- $event.stopProposation不是Angularjs单元测试中的函数错误
- 在单元测试时,如何测试绑定函数的相等性
- 未定义不是函数:单元测试护照身份验证自定义回调
- 使用函数单元测试弹出窗口