2014-09-19 10 views
7

우리의 내부 angularjs 프로젝트에서, 서비스 중 하나는 $http.head() 전화를 테스트하려고합니다.expectHEAD는 문서화되었지만 구현되지 않았습니까?

테스트를 위해 Fake HTTP backend (angular-mocks)을 사용하고 있습니다.

it('handle status code 200', inject(function ($httpBackend, ConnectionService) { 
    spyOn(Math, 'random').andReturn(0.1234); 

    httpBackend = $httpBackend; 
    httpBackend.expectHEAD('ping?rand=1234').respond(200); 
    ConnectionService.sendRequest(); 
    httpBackend.flush(); 

    expect(ConnectionService.stats.packetsReceived).toEqual(5); 

    httpBackend.verifyNoOutstandingExpectation(); 
    httpBackend.verifyNoOutstandingRequest(); 
})); 

다음과 같은 오류에 테스트 결과를 실행 : 다음은 관련 코드입니다

  • :

    PhantomJS 1.9.7 (Mac OS X) connection service tests sendRequest function handle status code 200 
    FAILED TypeError: 'undefined' is not a function (evaluating 'httpBackend.expectHEAD('ping?rand=1234')') 
    at /path/to/app/app-connection-service_test.js:66 
    at d (/path/to/app/bower_components/angular/angular.min.js:35) 
    at workFn (/path/to/app/bower_components/angular-mocks/angular-mocks.js:2159) 
    

    조금 파고 후를, 나는 관련 github에 문제를 발견했습니다 fix($httpBackend): Add missing expectHEAD() and expectOPTIONS() methods

내가 이해하는 한, 그쪽은 각도 모크에는 실제로 expectHEAD() 방법이 없습니다 - 문서화되어 있지만 실제로는 아직 안정된 각도 방출의 일부가 아닙니다.

앞으로 나아갈 수있는 가장 좋은 방법은 무엇입니까?

이 앱은 IE8 (각도 1.3은 dropping support for IE8)에서 실행해야하므로 각도 < = 1.2로 있어야한다는 것에 유의하십시오. 나는 현재에 대해 생각하고 해결 방법의


하나는 get()head()을 교체하는 것입니다. 이 경우 기존 expectGET() 방법으로 테스트 할 수 있습니다. 그러나 단점에 대해서는 잘 모르겠습니다.

답변

2

라이브러리를 포크하고 편집하는 것과는 대조적으로 기본 방법을 사용하는 것이 훨씬 더 좋습니다.

$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200); 

사용할 수없는 다른 방법은 바로 가기 방법입니다. 라이브러리를 변경하는 것보다이 방법을 사용하는 것이 훨씬 쉽고 쉽습니다.

+0

고마워, 나를 위해 일했다, 이것은 확실히 여기 쉬운 옵션이다. 비록 나는 @ dave의 답변이 하향 투표를받을 자격이 없다는 사실에 동의하지 않지만 그는 여전히 도우려고 노력했으며 그의 접근법은 여전히 ​​합법적이다. – alecxe

+0

그 말이 맞습니다. 저는 아직도 비교적 새로운 것입니다. 내 아래 vote를 삭제했습니다. –

+0

downvote를 삭제 해 주셔서 감사합니다. 당신이 더 쉬운 해결책을 제안한 이후 나는 당신의 대답을 받아 들였습니다. 추가 노력을 위해 데이브에게 현상금을 수여했습니다. 희망은 당신에게 공정한 것 같습니다. 다시 한번 감사드립니다. – alecxe

5

당신은 변화에 자신을 추가 할 수 있습니다

1523: - angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) { 
1523: + angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {  

당신이 비와 함께 머물 필요로 보는 : https://github.com/revolunet/angular.js/commit/b2955dd52725241dd9519baa12fe8ca74659004b

그것은 라인 1523에 각도-mocks.js에서 한 줄 변화의 어쨌든 Angular의 현재 버전을 사용하면 향후에 너무 많은 문제가 발생해서는 안됩니다.

편집 : JoelJeske의 대답을 검토하면 좋은 점을 알 수 있습니다. 포크없이 쉽게 할 수 있습니다. 나는 그의 솔루션을 만드는 것이 하나의 변화는, 대신에 내가 대신 직접 바로 가기 방법을 만들 것입니다 직접

$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200); 

메소드 호출하는 것입니다 :

$httpBackend.expectHEAD = function(url, headers) { 
    return $httpBackend.expect('HEAD', url, undefined, headers); 
}; 

을 그리고 당신은 할 수 있습니다 :

$httpBackend.expectHEAD('ping?rand=1234').respond(200); 
+0

쉬운 변경점입니다. 그러나 포크 앵글 모크 (fork angular-mocks)와 포크 (fork)를 사용하는 것이 바람직한 변화라고 생각하십니까? 고맙습니다! – alecxe

+0

포크로 만드는 것이 가장 쉬운 방법 일 수 있습니다. – dave

+0

Joel의 답변을 수락하지만 현상금을 수령하기로 결정했습니다. 희망은 당신에게 공정한 것 같습니다. 도와 주셔서 다시 한 번 감사드립니다! – alecxe