2016-10-20 1 views
1

nicht aufgerufen zu werden Ich teste eine eckige Service-Methode mit $ httpBackend und versuche, verschiedene Antworten basierend auf den Anfragedaten zu verspotten. Das Problem ist, wenn ich den Fehlerstatus sende, wenn die Anfrage ungültig ist, ruft sie immer noch den Erfolgsrückruf der $ http-Methode auf, daher kann ich die Fehlersituation nicht testen. Unten ist der Service:

app.service('dataService', function($http) { 
    var self = this; 
    this.getData = function (request) { 
     return $http({ 
      method: 'POST', 
      url: 'https://some-url/', 
      data: request 
     }).then(function successCallback(response) { 
      self.valid = true; 
      self.data = response.data; 
     }, function errorCallback(response) { 
      self.valid = false 
     }); 
    }; 
}); 

und unten ist der Testcode:

describe('.getData()', function() { 
    beforeEach(inject(function(_dataService_, _$httpBackend_) { 
     var dataService = _dataService_, 
      $httpBackend = _$httpBackend_; 
     $httpBackend.when('POST', 'http://some-url/', 'valid request') 
      .respond(200, 'data'); 
     $httpBackend.when('POST', 'http://some-url/', 'invalid request') 
      .respond(500, ''); 
    })); 

    // runs successfully 
    it('should store data correctly', function() { 
     dataService.getData('valid request').then(
      function success(){ 
       expect(dataService.data).toEqual('data'); 
      } 
     ); 
     $httpBackend.flush(); 
    }); 

    // TypeError: Cannot read property 'data' of undefined 
    // This error comes in service at successCallBack() line "self.data = response.data;" 
    it('should result in error if any', function() { 
     dataService.getData('invalid request').then(
      function success(){ 
       expect(dataService.valid).toEqual(false); 
      } 
     ); 
     $httpBackend.flush();   
    }); 
}); 

Wie ich analysiert, dies wegen der HTTP responseError Interceptor geschieht. Wenn ich den Interceptor entferne, funktioniert der Testcode einwandfrei (Erfolgs- und Fehlerrückrufe werden basierend auf dem Antwortstatus korrekt aufgerufen). Aber sobald ich responseError Interceptor verwende, "verschluckt" es den Fehler und verursacht successCallback() aufgerufen werden, und setzt response als undefined innerhalb des Erfolgs Callback.

Was ist die Lösung in diesem Fall? Wie können wir in diesem Fall Erfolgs- und Fehlersituationen testen?

Antwort

0

Meine schlechte, ich habe nicht die Ablehnung von der responseError HTTP Interceptor zurück. Die Zurückweisung der Zurückweisung (return $q.reject('Error')) löste das Problem.

0

Ich denke, Sie müssen auf die Antwort-Methode Signatur im offiziellen Dokument nachschlagen. Es sagt respond ein Argument vom Typ erwartet function, die ein Array zurückgibt:

$httpBackend.whenRoute('GET', '/users/:id') 
    .respond(function(method, url, data, headers, params) { 
    return [200, MockUserList[Number(params.id)]]; 
    }); 

In diesem Stück Code, ich einen Erfolg zurück, aber ich denke, das gleiche gilt für Fehler wahr ist (500):

... 
beforeEach(angular.mock.inject(function (ApprovalRule, $httpBackend, $http) { 
     ... 
     this.withOKEntities = function() { 
       var i1 = new ApprovalRule(); 
       i1.id = 10; 
       return [200, JSON.stringify([ i1]), {}]; 
     } ... 
    })); 
... 
it('should resolve to list of approvalrules', function() { 
      this.httpBackend.whenGET(new RegExp('.*/api/approvalrules/')).respond(this.withOKEntities); 
      var result = this.sut.getAll(); 
      result.then(this.OnResponse.readResult); 
      this.httpBackend.flush(); 
      expect(check.array.of.instance(this.OnResponse.result, this.ApprovalRule)).toBe(true); 
     }); 
Verwandte Themen