angularjs 1和jasmine,服务承诺测试

时间:2016-06-22 02:18:54

标签: angularjs jasmine

我试图弄清楚如何使用karma + jasmine测试服务承诺,但没有成功。到目前为止,这是我对结果错误所做的:

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);

  });
});

我想知道是否有一些我可能会遗漏的东西可以帮助我理解这一点,

谢谢!

2 个答案:

答案 0 :(得分: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');

});

答案 1 :(得分: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();

    });

});