2

局勢:噶茉莉:意外的請求:GET ...沒有更多的要求預計

我測試在我AngularJs應用兩種不同的HTTP調用。

有一種奇怪的行爲。如果我分別測試每一個,其他臨時註釋(在控制器和測試中),每一個工作正常,測試通過。

但是,如果我跑因果報應的時候有兩個測試,他們失敗了,給了以下錯誤消息:

Unexpected request: GET https://MY_DOMAIN_2.com/list_project 
No more request expected 

控制器:

.controller('TestController', function($scope, $http, $timeout) { 

    $scope.getLanguageList = function() 
    { 
     $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) 
     { 
      $scope.language_list = resp.data; 
     }, 
     function(err) 
     { 
      $scope.language_list = []; 
     }) 
    } 

    $scope.language_list = []; 
    $scope.getLanguageList(); 


    $scope.get_project_list = function() 
    { 
     $http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp) 
     { 
      $scope.project_list = resp.data; 
     }, 
     function(err) 
     { 
      $scope.project_list = []; 
     }) 
    } 

    $scope.project_list = []; 
    $scope.get_project_list(); 

}) 

的測試:

describe('Http requests tests', function() { 

beforeEach(module('my_app.controllers')); 

var $controller; 
var $httpBackend; 
var $scope; 
var $timeout; 


describe('Lists test', function() 
{ 

    beforeEach(angular.mock.http.init); 
    afterEach(angular.mock.http.reset); 

    beforeEach(inject(function(_$controller_, _$httpBackend_) 
    { 
     $controller = _$controller_; 
     $scope = {}; 
     $httpBackend = _$httpBackend_; 

    })); 


    it('should load default language list', function (done) 
    { 
     $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough(); 

     var TestController = $controller('TestController', { $scope: $scope }); 

     setTimeout(function() 
     { 
      expect($scope.language_list).not.toEqual([]); 
      done(); 
     }, 1000); 

    }); 


    it('should load default project list', function (done) 
    { 
     $httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough(); 

     var TestController = $controller('TestController', { $scope: $scope }); 

     setTimeout(function() 
     { 
      expect($scope.project_list).not.toEqual([]); 
      done(); 
     }, 1000); 

    }); 

}); 

}); 

問題:

爲什麼我得到那個錯誤信息? 代碼應該沒問題,因爲他們分開工作正常。我錯過了什麼嗎?

謝謝!

+0

如果你有什麼改變了你的$範圍= {}至$範圍= $ rootScope。$新的()? –

+0

已經嘗試過但沒有任何改變。 – johnnyfittizio

回答

5

下面是一些指針和演示http://plnkr.co/edit/Kp9C4S6oNVu1MM1YLb90?p=preview

  • 您應該使用$httpBackend.flush()而不是setTimeout()。通過這種方式,您可以控制異步請求返回的時間。它使測試更容易。

  • 把你的$ httpBackend和控制器拉到beforeEach語句中。當你的控制器被創建時,它會觸發這兩個url。然後你可以單獨評估它。當它在it語句中被隔離時,它不會調用其他$ http並引發意外的url錯誤。

  • 你也應該模擬你的$ http請求的響應,而不是passThrough。你並不總是有互聯網連接,並且響應可能會改變。因此,讓模擬數據看起來像你期望的。

  • 此外,$httpBackend.whenGET('httpS://MY_DOMAIN_2.org/projectList')正在請求不正確的網址。它應該是小寫s.com網址。這是因爲控制器正在請求

    $http.get(' https://MY_DOMAIN_2.com/projectList ')

+0

非常感謝!爲解決方案和明確的解釋。關於最後一點,S大寫是一個錯字,但爲什麼應該.com而不是.org? – johnnyfittizio

+0

順便說一句,這裏有一個問題,我相信你知道答案:http://stackoverflow.com/questions/32243100/jasmine-how-to-see-the-reports-in-the-browser – johnnyfittizio

+0

它應該是'因爲你在你的控制器中調用了.com。 '$ http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp)' – angmerica

3

不要使用超時,並同時對其進行測試:

it('should load default language list and the default project list', function(){ 
    $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough(); 
    $httpBackend.whenGET('httpS://MY_DOMAIN_2.org/projectList').passThrough(); 

    var TestController = $controller('TestController', { $scope: $scope }); 

    $httpBackend.flush(); 

    expect($scope.language_list).not.toEqual([]); 
    expect($scope.project_list).not.toEqual([]); 
}); 
+0

感謝您的回覆。我已經嘗試過,但我目前得到這個錯誤:沒有待處理的請求刷新! – johnnyfittizio

+0

但是,按照您的建議,聯合在一個獨特的測試工作!但只使用超時..爲什麼刷新不能正常工作?爲什麼作爲一個單一的測試工作,而不是作爲兩個單獨的測試工作..? – johnnyfittizio