2013-05-29 83 views
6

我想在我的角度框架來測試控制器的角度控制器:

.controller('UserCtrl', ['$scope', '$location', 'User', 'Config', 
    function ($scope, $location, User, Config) { 
     ... 
    }]) 

該控制器取決於一對夫婦需要$ HTTP對象進行服務服務器調用:

.factory('User', ['$http', function ($http) { 
    var data = {}; 

    return { 
     query: function(oper, putdata, callback){ 
      if(oper == 'get'){ 
      $http.get(getUrl("user",null)).success(function(data2) { 
       console.log(data2); 

       callback(data2); 
       data.userinfo = data2; 
      }); 
      }, 

     userinfo: data 
    }; 
}]) 

但是當我嘗試自舉控制器我不能讓httpBackend工作:

describe('UserCtrl', function(){ 

    var ctrlScope, ctrl, $httpBackend, controllerService; 

    beforeEach(
     inject(function($httpBackend, $http, $rootScope, $controller, User, Config) { 
      _User = User; 
      _Config = Config; 
      spyOn(User, 'getUserInfo').andCallThrough(); 
      //spyOn(User, 'query').andCallThrough(); 

      ctrlScope = $rootScope.$new(); 
      controllerService = $controller; 
      httpMock = $httpBackend; 

     }) 
    ); 

    it('should create setup userinfo object ', function() { 
     httpMock.expectGET("/user/default/details"). 
      respond({somejson}); 

     ctrl = controllerService('UserCtrl', {$scope: ctrlScope, $location: location, User: _User, Config: _Config}); 
     expect(_User.getUserInfo).toHaveBeenCalled(); 
     httpMock.flush(); 
     expect(ctrlScope.userinfo.length).toBe(1); 

    }); 
}); 

所有我曾經得到的是:

Error: No pending request to flush ! 

所以是有可能使用httpBackend與您從您正在測試一個名爲控制器的服務?

+0

getUserInfo定義在哪裏?看起來你的方法仍然被稱爲'查詢'? – Rafi

回答

1

是否有你想特別測試GET請求的原因?這是您的用戶服務的實施細節。不管你的函數是調用query()還是getUserInfo(),我懷疑你真正想知道的是你的用戶服務上調用了這個函數。這取決於用戶服務擁有自己的一組測試,這些測試將測試對/ user/defaults/details發出的GET請求。

背後的原因是,當您更改User Service的實現時,您不希望不相關的單元測試中斷。當您的API更改爲/user/query時會發生什麼?您的UserCtrl測試不應該中斷,也不應該使用用戶服務的任何其他控制器。如果您的UserCtrl在用戶服務上調用getUserInfo(),就您所關心的而言,它正在做正確的事情。您的用戶服務單元測試將會中斷,一旦您修復它們以指向您的新網址,所有內容都將按順序排列。

+0

我正要問同樣的想法,掙扎幾個小時試圖測試類似的情況。感謝你的回覆,它澄清了很多事情 –

相關問題