我正在尝试测试通过服务执行http请求的控制器。
我应该只是模拟服务并返回默认值,而不是执行实际的http请求,或使用$httpBackend
。
顺便说一句,我在Jasmine进行测试。
感谢。
答案 0 :(得分:0)
使用$httpBackend
因为您还需要模拟响应
$httpBackend.when("GET",'URL').respond(respnonse);
响应包含您期望的值。
答案 1 :(得分:0)
TL; DR 不要执行实际的http请求。
所以要回答你的问题,这取决于你的写作。当你编写适当的单元测试时,你应该模拟服务:
$provide.service('DataService', ['$q', function($q) {
this.get = function() {
return $q(function(resolve, reject) {
if (requestFailed) {
reject('The request failed');
}
resolve(APIData);
});
};
}]);
如果您正在进行整合测试,则应使用$httpBackend
模拟实际的$ http请求。
it('should request data', function() {
$httpBackend
.expect('GET', url)
.respond(APIData);
expect($scope.list.count).toEqual(0);
$scope.clickRetrieve();
$httpBackend.flush();
expect($scope.list.count).toBeGreaterThan(0);
});
我正在开发一个相当大的应用程序,并且没有太多的测试经验。但我最喜欢的测试类型是迄今为止的集成测试。我在单元测试方面遇到了一些问题,这些问题没有显示出由于模拟服务导致的重大变化。由于我几乎只切换到集成测试,我几乎专门模拟我的数据服务。
旁注:我使用数据服务作为我的应用程序和API之间的层,如果API更新,理论上我应该只更新数据服务除了存储库访问这些类之外的类。
这样我可以确保在我的应用程序中我只使用DataModels而不是简单的对象,并且我使用undefined
,而不是null
。