2016-03-19 9 views
0

Ich habe ein Problem, wenn ich einen Jasmin-Komponententest mit $ httpBackend Backend Mock ausführen. Ich möchte den von einem Serviceanruf zurückgegebenen Wert testen. Es ruft den Dienst an und trifft den Endpunkt, aber ich erhalte weiterhin einen Fehler von der Methode selbst. Ich bin mir nicht sicher, was mir fehlt, damit das funktioniert. Jede Hilfe wird wirklich geschätzt.

// Fehler

TypeError: 'undefined' is not an object (evaluating 'data[0].data') 

/// Unit-Test

describe("DataService", function() { 

     describe('testing service', function() { 
      var TheService, scope; 

      beforeEach(function() { 
       module(moduleName); 
       module('services'); 
      }); 

      beforeEach(inject(function($injector,$rootScope) { 
       TheService = $injector.get('TheService'); 
       scope=$rootScope.$new(); 
      })); 

      it('should have a method defined', function() { 
       expect(TheService.getStuff).toBeDefined(); 
      }); 

      it('should have a method defined', inject(function($httpBackend) { 

      var mock = { data: 'World' }; 


       $httpBackend.whenGET("/theurl/getStuff").respond({ data: 'World' }); 


       $httpBackend.expectGET("/theurl/getStuff"); 

       TheService.getStuff(); 

       scope.$digest(); 

       expect(TheService.getStuff).toEqual(mock); 

       $httpBackend.flush(); 
      })); 

     }); 

}); 

// Service-Methode

function TheService($http, $q) { 
     var vm = this; 


     vm.getStuffs = null; 
     vm.getStuff = getStuff; 
     vm.theresponse = {}; 

     function getStuff() { 

      var deferred = $q.defer(); 

      $http({ 
       method: 'GET', 
       url: "/theurl/getStuff" 

      }).success(function(data){ 

       vm.theresponse = data[0].data 
       deferred.resolve(vm.theresponse); 

      }).error(function(){ 

       deferred.reject('An error occurred'); 

      }); 

      return deferred.promise; 
     } 
    } 

Antwort

2

Nun, die gefälschte Endpunkt kehrt

{ data: 'World' } 

Aber der Dienst versucht,

data[0].data 

Daten zuzugreifen ein Objekt ist. Es ist kein Array. Also data[0] ist undefiniert.

Für den Service-Code funktionieren, sollten Sie so etwas wie

[{ data: 'World' }] 

auch zurückkehren, Ihr Code ein Versprechen Antipattern verwendet, und veralteten Erfolg und Fehler Rückrufe. Lesen Sie http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ für eine bessere Alternative:

+0

danke @JB. Ich kann nicht glauben, dass ich das verpasst habe. – Jimi

Verwandte Themen