2016-03-19 52 views
0

我在使用$ httpBackend後端模擬運行茉莉花單元測試時遇到問題。我想測試從服務調用返回的值。它正在調用服務並達到終點,但我一直從方法本身收到錯誤。不知道我錯過了什麼,爲了這個工作。任何幫助真的很感激。

//錯誤

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

///單元測試

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

     }); 

}); 

//服務方法

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

回答

2

那麼,假端點返回

{ data: 'World' } 

但服務試圖訪問

data[0].data 

數據是一個對象。這不是一個數組。所以data[0]是未定義的。

對於服務代碼工作正常,你應該返回類似

[{ data: 'World' }] 

而且,您的代碼使用一個承諾反模式,並棄用成功和錯誤回調。閱讀http://blog.ninja-squad.com/2015/05/28/angularjs-promises/以獲得更好的選擇:

+0

謝謝@JB。不能相信我錯過了這一點。 – Jimi