2015-02-23 98 views
0

我是新來與角度的單元測試,我有麻煩了很多,甚至越來越開始測試。我有一個控制器調用一個服務,調用遠程api獲取貨幣列表,然後用符號屬性擴充返回的對象並將其分配給作用域變量。角單元測試的建議

我一直在尋找很多httpBackend教程,但是這兩塊不裝配在一起。我知道我必須使用whenGet並expectGet但仍然不明白他們是什麼,什麼時候應該使用它們,甚至我應該測試什麼 - 請求,響應?他們是否應該在it函數的beforeEach函數中?

控制器:

whiskyControllers.controller('currencyCtrlr', ['$scope', 'CurrencyConversion', 'UpdateMiniBasket', 'whiskyList', 
    function($scope, CurrencyConversion, UpdateMiniBasket, whiskyList){ 

     $scope.getCurrencies = function(e){ 
      e.preventDefault(); 

      CurrencyConversion.async().then(function(d) { 

       $scope.rates = d.data.rates; 

       for(var i = 0, j = $scope.rates.length; i < j; i++){ 
        $scope.rates[i]['symbol'] = insertSymbol($scope.rates[i].to); 
       } 
      }); 
     } 
}]); 

我複製的散裝從另一個教程下面的測試,但它仍然不能與「錯誤:沒有掛起的請求以刷新」

測試:

describe('currencyCtrlr: getCurrencies', function() { 
    var scope, CurrencyConversion, UpdateMiniBasket, whiskyList, $httpBackend, $rootScope, createController, 
     url = 'http://api.exchangeratelab.com/api/current/GBP?apikey=F06383D65BCBFF52629D059B7D3EEB7D&callback=JSON_CALLBACK'; 

    beforeEach(module('whiskyControllers')); 

    beforeEach(function() { 
     module(function ($provide) { 
      $provide.value('CurrencyConversion', CurrencyConversion); 
      $provide.value('UpdateMiniBasket', UpdateMiniBasket); 
      $provide.value('whiskyList', whiskyList); 
     }); 
    }); 

    beforeEach(inject(function($injector) { 
     //scope = $rootScope.$new(); 
     $httpBackend = $injector.get('$httpBackend'); 
     $httpBackend.when('GET', url).respond({}, {}); 

     $rootScope = $injector.get('$rootScope'); 
     var $controller = $injector.get('$controller'); 

     createController = function() { 
      return $controller('currencyCtrlr', {'$scope' : $rootScope }); 
     }; 
    })); 

    it('should make an ajax call to http://api.exchangeratelab.com', function() { 
     $httpBackend.expectGET(url); 
     var controller = createController(); 
     $httpBackend.flush(); 
    }); 

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

}); 

任何幫助將是非常讚賞

回答

1

當您創建ŧ他控制着createControllergetCurrencies方法沒有被調用。因此,沒有$http調用flush。試試這個代替:

it('should make an ajax call to http://api.exchangeratelab.com', function() { 
     $httpBackend.expectGET(url); 
     var controller = createController(); 
     $rootScope.getCurrencies(); 
     $httpBackend.flush(); 
}); 

雖然,上面的代碼可能會在e.preventDefault()上出錯。所以,你需要傳遞一些能夠滿足這個要求的東西,或者刪除它(因爲它確實不應該被需要)。

是有點奇怪的另一件事是,你正在使用$rootScope$scope。這可能是最好創建一個本地scope財產和創建一個新的範圍有:

scope = $rootScope.$new(); 

,然後用它來調用範圍的方法。

+0

非常感謝。這工作,我已經處理了事件錯誤。不過,我仍然得到類型錯誤:CurrencyConversion在我的控制器功能不確定,我不明白,因爲我已經它注入控制器,它不會導致應用項目本身的錯誤: 'whiskyControllers.controller('currencyCtrlr 」,[ '$範圍', 'CurrencyConversion', 'UpdateMiniBasket', 'whiskyList',' 也可能你解釋何時以及如何使用whenGet和expectGet?謝謝。 – 2015-02-24 08:36:03