javascript - Testing Angular Service resolve promise in error callback -
i trying figure out how test 403 response in following code. code works expected. realized using 403 not best option here out of control right , cant change it. new js testing feel missing , have reached end of knowledge. appreciated.
this.joinitem = function(item, joinoption) { var deferred = $q.defer(), joinurl = ('http://testurl.com/company/items/abc456/join', joindata), joindata = { match: { minid: joinoption['id'] } }; $http.post(joinurl, joindata, { headers: headers }) .success(handlejoinsuccess) .error(handlejoinerror); function handlejoinsuccess() { deferred.resolve({status: 204}); }; function handlejoinerror(joinedresponse, status) { var joineditems = joinedresponse['joined_items']; if (status === 403) { deferred.resolve({ joineditems: joineditems, status: status }); } else { deferred.reject({ status: status }); } } return deferred.promise; };
here test have far. have no idea how promise resolve. may have more crap in test needed lost right have no idea.
describe('itemservice', function () { 'use strict'; var subject; beforeeach(inject(function (_itemservice_) { subject = _itemservice_; })); describe('#joinitem 403', function () { var $httpbackend, $rootscope, deferred, item, joinoption, joindata, joinedresponse, joinrequest, joineditemsresults, joineditems; beforeeach(inject(function(_$httpbackend_, $q, _$rootscope_) { $httpbackend = _$httpbackend_; $rootscope = _$rootscope_; deferred = $q.defer(); item = { id: 'abc456' }; joinoption = { id: 'optid' }; joindata = { match: { minid: 'optid' } }; joinedresponse = { 'joined_products': []}; joinrequest = $httpbackend.whenpost('http://testurl.com/company/items/abc456/join', joindata).respond(403); joineditemsresults = { joined_products: [], status: 403 }; })); aftereach(function() { $httpbackend.verifynooutstandingexpectation(); $httpbackend.verifynooutstandingrequest(); }); describe('when request completes 403 status', function () { it('resolves promise', function () { var handler = jasmine.createspy('error'); var promise = subject .joinitem(item, joinoption); promise.then(handler); deferred.resolve(joinedresponse); $rootscope.$digest(); $httpbackend.flush(); expect(promise).toberesolvedwith(joineditemsresults); }); });
i have setup jsfiddle problem. in test have simplified post url. notice :
you should return data response(because in real service) when
expectpost
$httpbackend
. ex :$httpbackend.whenpost('/path/to/your/url') .respond(403, yourerrorresponsedata);
because
$http
return promise, dont need returndefer.promise
in test, can test data return in $httpbackend using promise. , dont forget call
$httpbackend.flush
flush request.myservice.joinitem(item, joinoption).then(function (data) { expect(data).toequal(joineditemresults); }); $httpbackend.flush();