2016-07-08 3 views
1

Hier ist mein Code:

export class httpService { 

constructor($q, $http){ 
    this.$q = $q; 
    this.$http = $http; 
} 

static getError(response) { 
    if (response.data && response.data.messages) { 
     return response.data.messages; 
    } else { 
     return ["Sorry, there is an internal issue..."]; 
    } 
} 

httpRequest(url, method, data) { 
    url = encodeURI(url); 
    var deferred = this.$q.defer(); 
    this.$http({ 
     method: method, 
     url: url, 
     data: data 
    }).then(function (response) { 
     deferred.resolve(response.data); 
    }, function (response) { 
     deferred.reject(httpService.getError(response)); 
    }); 
    return deferred.promise; 
} 

}

Mein Testcode:

import angular from 'angular'; 
import ngMock from 'angular-mocks'; 
import {httpService as HttpService} from '../http.service'; 

describe("httpService",()=>{ 
    var httpService; 
    var $q; 
    var $timeout; 
    var $httpBackend; 
    var campaignHttpRequestHandler; 
    var campaignTestUrl = 'api/campaign/aGJhZ2ZmZ2RmcmZ0'; 
    var campaignData = { 
     "articles": [ 
      { 
       "id": "1207", 
       "type": "a", 
       "order": 1 
      }, 
      { 
       "id": "940", 
       "type": "p", 
       "order": 2 
      }, 
      { 
       "id": "1268", 
       "type": "a", 
       "order": 3 
      }, 
      { 
       "id": "954", 
       "type": "p", 
       "order": 4 
      } 
     ], 
     "year_month": "201606", 
    }; 

    beforeEach(inject((_$q_, _$timeout_, _$httpBackend_)=>{ 
     $q = _$q_; 
     $timeout = _$timeout_; 
     $httpBackend = _$httpBackend_; 
     campaignHttpRequestHandler = $httpBackend.when('Get', campaignTestUrl).respond(campaignData); 

    })); 

    beforeEach(()=>{ 
     httpService = new HttpService($q, $httpBackend); 
    }); 

    afterEach(function() { 
     $httpBackend.verifyNoOutstandingExpectation(); 
     $httpBackend.verifyNoOutstandingRequest(); 
    }); 

    describe("#httpRequest()",()=>{ 

     it('should get campaign data',()=>{ 
      $httpBackend.expect('Get', campaignTestUrl); 

      httpService.httpRequest(campaignTestUrl, 'Get').then(
       (response)=>{ 
        expect(response).toEqual(campaignData); 
       } 
      ); 

      $httpBackend.flush(); 


     }); 


    }); 





}); 

Der Fehler:

#httpRequest() 
     ✖ should get campaign data 
     Chrome 51.0.2704 (Mac OS X 10.11.5) 
     Error: Unexpected request: [object Object] undefined 

Und Ich debugged in den Quellcode, $ http hat Biene n ersetzt durch $ httpBackend. Irgendwie ist der erste Parameter von $ httpBackend: Methode, es ist ein Objekt enthält Methode, URL, Daten, die gleichen Anfrage Parameter wie in $ http. Anscheinend ist es falsch. Aber ich weiß nicht, wie man es repariert ~

Hilfe bitte. Ich habe hier für den ganzen Tag stecken ~

+0

Was passiert, wenn Sie 'GET' und nicht 'Get' verwenden, wie dokumentiert? Oder noch besser: wenn GET() und expectGET()? –

+0

@ JBNizet der gleiche Fehler, es hat das Problem nicht gelöst –

+0

$ http ist nicht gleich $ httpBackend, sie können nicht synonym verwendet werden. Diese Art von Fehler wird nicht passieren, wenn Dienste auf die vorgeschlagene Weise getestet werden. Gibt es einen Grund, warum die HttpService-Klasse manuell instanziiert wird? – estus

Antwort

1

Sie sollten $ http statt $ httpBackend als Konstruktor Parameter übergeben.

Erstellen Sie eine Variable vom Typ $ http in Ihrem Testcode und übergeben Sie es wie diese

beforeEach(()=>{ 
    httpService = new HttpService($q, $http) 
}); 

es sicher funktionieren.

+0

ReferenceError: $ http ist nicht definiert –

+0

beforeEach (() => { httpService = neuer HttpService ($ q, $ http); }); –

+0

Sie müssen $ http definieren, wie Sie $ httpBackend definieren, bevor Sie es in Ihrem Testcode verwenden ... – Ajay

Verwandte Themen