2015-10-20 75 views
3

現象:Karma-Jasmine:如何正確測試http調用?

我需要測試一個http調用,並確保它被正確調用。

在應用程序中一切正常:$ scope.language_list正確地從API

檢索數據,但在測試$ scope.language_list是不確定的。 因此,我可能不會讓測試正確。

的代碼:

功能:

測試:

describe('Http calls test', function() { 

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

    beforeEach(inject(function(_$controller_, _$httpBackend_) 
    { 
     $scope = {}; 
     var controller = $controller('MainCtrl', { $scope: $scope }); 

     $httpBackend = _$httpBackend_; 
     $httpBackend.whenGET('http://my_app.org/languageList').respond(200); 

    })); 

    it('should load default language list', function() 
    { 
     $httpBackend.flush(); 

     console.log($scope.language_list); 

     expect($scope.valid).toBe(true); 
     expect($scope.language_list).not.toEqual(undefined); 
    }); 


}); 

其結果是:

$ scope.valid測試正常。如果我故意改變它在函數中的值來看到測試失敗,它確實會失敗,否則會被正確地傳遞爲真。

但是$ scope.language_list工作不正常,並且因未定義傳遞。事實上,該錯誤信息是:Expected undefined not to equal undefined.

問題:

我怎麼能正確測試HTTP調用? 爲什麼$ scope.language_list未定義?我在測試中做錯了什麼?

非常感謝!

回答

3

您需要提供一個模擬響應對象。目前,您的成功函數中的「數據」參數未定義。要定義一個響應:

beforeEach(inject(function(_$controller_, _$httpBackend_) 
{ 
    $scope = {}; 
    var controller = $controller('MainCtrl', { $scope: $scope }); 

    $httpBackend = _$httpBackend_; 

    //Tell the $httpBackend to respond with our mockLangularList array. Or whatever the api actually returns.Array used for example. 
    var mockLanguageList = [{key: ''},{key: ''},{key: ''}]; 
    $httpBackend.whenGET('http://my_app.org/languageList').respond(200, mockLanguageList); 

})); 

另外,你是否每次調用$ scope.get_language_list()?

it('should load default language list', function() 
{ 
    $scope.get_language_list(); // <-- Make call 
    $httpBackend.flush(); 

    console.log($scope.language_list); 

    expect($scope.valid).toBe(true); 
    expect($scope.language_list).not.toEqual(undefined); 
}); 
+0

謝謝你的回覆。我不明白一件事:以這種方式$ scope.language_list將包含我先前傳遞給mockLanguageList的任何值。如果它是一個空數組將是一個空數組。如果mockLanguageList ='hello',那麼$ scope.language_list將包含'hello'。那麼我怎麼知道http調用已被正確調用?不應該包含來自api的真實數據? – johnnyfittizio

+0

@johnnyfittizio mockLanguageList應該設置爲api應該返回的內容。通過前端單元測試,您不希望實際調用api。這可能會引入主要的複雜性(身份驗證)測試實際的API將從您的服務器端代碼測試套件中完成。我們只想在這裏測試前端代碼。當您指定whenGET('...')時,您正在驗證正確的api。 –