2015-04-10 3 views
0

Я пытаюсь выяснить, как протестировать ответ 403 в следующем коде. Код работает так, как ожидалось. Я понял, что использование 403 - не самый лучший вариант здесь, но сейчас это не в моих силах, и я не могу его изменить. Я новичок в тестировании JS, чувствую, что я что-то упускаю и дошел до конца своих знаний. Любая помощь будет оценена по достоинству.Тестирование Угловое обслуживание разрешить обещание в обратном вызове ошибки

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; 
}; 

Вот тест, который у меня есть до сих пор. Я не знаю, как это обещание решить. У меня может быть больше дерьма в этом тесте, чем нужно, но я так потерялся прямо сейчас, я понятия не имею.

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 with 403 status', function() { 
    it('resolves the 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); 
    }); 
}); 

ответ

1

У меня есть jsfiddle для вашей проблемы. В тесте я упростил ваш URL-адрес POST. Что-то заметил:

  1. Вы должны вернуть ответ данных (Потому что вы делаете, что в реальной эксплуатации), когда expectPOST от $httpBackend. Пример:

    $httpBackend.whenPOST('/path/to/your/url') 
          .respond(403, yourErrorResponseData); 
    
  2. Поскольку $http уже вернуть обещание, так что вам не нужно возвращать defer.promise

  3. В тесте, вы можете проверить данные, которые вы возвращаетесь в $ httpBackend используя обещание. И не забудьте позвонить $httpBackend.flush, чтобы запросить флеш.

    myService.joinItem(item, joinOption).then(function (data) { 
         expect(data).toEqual(joinedItemResults); 
    }); 
    $httpBackend.flush(); 
    
+0

Спасибо за вашу помощь. Я знал, что, вероятно, я делаю это сложнее, чем нужно. Спасибо за пример jsfiddle. – mpowmap

Смежные вопросы