我正在尝试在角度服务中实现一些http.get()
请求,返回一个promise。
以下是我最初服务的摘录:
angular.module('dashboard').service('DashboardHTTP', ['$q', '$http', function ($q, $http) {
this.get_info = function () {
var deferred = $q.defer();
$http.get('/dashboard/4/api/info', { cache: true }).success(function (data) {
deferred.resolve(data);
}).error(function () {
deferred.reject('Could Not Complete Request');
});
return deferred.promise;
}
}]);
以下是我控制器中我称之为服务部分的摘录:
DashboardHTTP.get_info().then(
function (response) {
var resp = response;
$rootScope.dash_info = resp;
},
function (response) {
return 'error';
},
function (response) {
return 'notify';
});
我的问题:
我正在努力确定像这样的互动需要多少测试。我目前正在进行以下测试,即在服务级别进行测试,但我想知道是否需要在控制器级别进行测试,如果需要,需要进行哪种测试?
beforeEach(inject(function (_$httpBackend_, $injector) {
service = $injector.get('DashboardHTTP');
$httpBackend = _$httpBackend_;
}));
afterEach(function () {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
describe('get_info', function () {
it(' should get info from the url /api/info', function () {
var returnData = { data: 'lots of data' };
$httpBackend.expectGET('/dashboard/4/api/info').respond(returnData);
var returnedPromise = service.get_info();
var result;
returnedPromise.then(function (response) {
result = response;
});
$httpBackend.flush();
expect(result).toEqual(returnData);
});
});
我的目标是我想将$rootScope.dash_info
设置为Service.get_info()
发出的HTTP请求的响应。我的控制器中的实现是否合适?如果是这样,我如何测试在控制器级别传递正确的数据?
答案 0 :(得分:0)
这可能是部分答案,但这是我的意见:
您的通话是异步的,因此您的测试应该是。使用done
。
it(' should get info from the url /api/info', function (done) {
var returnData = { data: 'lots of data' };
$httpBackend.expectGET('/dashboard/4/api/info').respond(returnData);
var returnedPromise = service.get_info();
var result;
returnedPromise.then(function (response) {
result = response;
expect(result).toEqual(returnData);
done();
});
$httpBackend.flush();
});
另外,你知道http.get会返回一个承诺,对吧?它还有success
和error
个函数,但它仍然是一个承诺。