2016-06-22 103 views
3

我想弄清楚如何使用業力+茉莉花測試服務承諾,但沒有成功。到目前爲止,這是我做過什麼,結果錯誤:angularjs 1和茉莉花,服務承諾測試

PhantomJS 2.1.1 (Mac OS X 0.0.0) The FetchData service should fetch data FAILED 
    Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 

fetchData服務:

module.exports = function($http) { 
    return { 
     getFoo: function(id) { 
      return $http.get('https://api/' + id) 
         .then(function(result) { 
          return result.data; 
         }); 
     } 
    } 
}; 

測試:

describe('The FetchData service', function() { 

    var dataFetcher; 

    beforeEach(angular.mock.module("myApp")) 

    beforeEach(inject(function(_dataFetcher_) { 
    dataFetcher = _dataFetcher_; 
    })); 

    it('should fetch data', function(done) { 

    var testData = function(res) { 
     expect(res.success).toBe(true); 
    }; 

    var failTest = function(error) { 
     expect(error).toBeUndefined(); 
    }; 

    dataFetcher.getFoo(id) 
     .then(testData) 
     .catch(failTest); 

    }); 
}); 

我不知道是否有東西,我可能會丟失,可以幫我理解這一點,

謝謝!

+0

https://docs.angularjs.org/api/ngMock/service/$httpBackend – Phil

回答

1

您需要在測試中注入$ httpBackend服務來模擬$ http服務。

然後你需要調用$ httpBackend.flush來模擬實際的HTTP調用。 請檢查角度文檔,例如。

編輯:

it('should fetch data', function() { 

    var status, data; 
    function successCB(response){ 
    status = 'success'; 
    data = response.data; 
    } 
    function errorCB(){ 
    status = 'error' 
    } 
    //only pass the success and error callbacks here 
    dataFetcher.get(1).then(successCB, errorCB); 

    // you need to stop it  
    $httpBackend.flush(); 

    //assert for success 
    $httpBackend 
    .when('GET', 'https://api/1') 
    .respond(200, {foo:'bar'}); 

    expect(status).toEqual('success'); 
    expect(data).toEqual({foo: 'bar'}); 

    //assert for error 
    $httpBackend 
    .when('GET', 'https://api/1') 
    .respond(500, 'An error has occured.'); 

    expect(status).toEqual('success'); 

}); 
0

這是我走到這一步的解決方案,根據實際Angularjs文檔。

我希望這是不言自明的(總部設在@ mehndra的答案和提示更新):

describe('The FetchData service', function() { 

    var dataFetcher, $httpBackend; 

    beforeEach(angular.mock.module("myApp")); 

    beforeEach(inject(function(_dataFetcher_, _$httpBackend_) { 
     dataFetcher = _dataFetcher_; 
     $httpBackend = _$httpBackend_; 
    })); 

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

    it('should fetch data', function() { 

     var status, data, 
      pid = 2140, 
      api = 'https://api'; 

     function successHandler(res){ 
      status = 'success'; 
      data = res.data; 
      expect(res.success).toEqual(true); 
      expect(status).toEqual('success'); 
     } 

     function errorHandler(){ 
      status = 'error' 
     } 

     $httpBackend 
     .when('GET', api + '/' + pid) 
     .respond({ success: true }); 

     $httpBackend 
     .when('GET', api + '/' + pid) 
     .respond(500, 'An error has occured.'); 

     dataFetcher.get(pid).then(successHandler, errorHandler); 

     $httpBackend.flush(); 

    }); 

}); 
+0

您的解決方案似乎是正確的但我覺得你的說法可以比這個好一點。 也許你可以在測試中的服務調用中傳遞成功和錯誤處理程序,然後檢查哪一個被調用。 我只是想避免在回調中斷言。 –

+0

@MahendraSingh介意提供一個例子? – punkbit

+0

請檢查編輯。 –