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 :

  1. you should return data response(because in real service) when expectpost $httpbackend. ex :

    $httpbackend.whenpost('/path/to/your/url')             .respond(403, yourerrorresponsedata); 
  2. because $http return promise, dont need return defer.promise

  3. 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();  

Popular posts from this blog