【问题标题】:service promise not resolving with karma服务承诺无法解决业力
【发布时间】:2016-04-27 15:43:31
【问题描述】:

我有一个service factory,它与api 连接并交互数据。这是服务:

angular.module('dbRequest', [])
  .factory('Request', ['$http', 'localConfig', function($http, localConfig){
    return {
      getDataRevision: function(){
        return $http({
          url: localConfig.dbDataUrl,
          method: "GET",
          crossDomain: true,
          headers: {
            'Content-Type': 'application/json; charset=utf-8'
          }
        })
      }
    }
  }]);

this answer 中获取线索,这就是我测试该方法的方式:

describe('Service: Request', function () {
  var $scope, srvMock, $q, lc, $httpBackend;

  beforeEach(module('webApp'));

  beforeEach(inject(function($rootScope, Request, _$q_, _$httpBackend_, localConfig){
    $scope = $rootScope.$new();
    srvMock = Request;
    $q = _$q_;
    $httpBackend = _$httpBackend_;
    lc = localConfig;

    $httpBackend.expect('GET', lc.dbDataUrl);

    $httpBackend.when('GET', lc.dbDataUrl).respond({
      success: ["d1","d2", "d3"]
    });
  }));

  it('should return a promise', function(){
    expect(srvMock.getDataRevision().then).toBeDefined();
  });

  it('should resolve with data', function(){
    var data;
    var deferred = $q.defer();
    var promise = deferred.promise;

    promise.then(function(res){
      data = res.success;
    });

    srvMock.getDataRevision().then(function(res){
      deferred.resolve(res);
    });

    $scope.$digest();

    expect(data).toEqual(["d1","d2", "d3"]);
  })
});

should return a promise 通过,但下一个should resolve with data 失败并出现此错误:

Expected undefined to equal [ 'd1', 'd2', 'd3' ].

但是,service 方法 getDataRevision 被调用,但没有被测试中的模拟承诺解决。如何更正?

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine karma-jasmine


    【解决方案1】:

    目前,您希望模拟数据存在于 data 变量中而不刷新 httpRequests,但直到您 flush 所有 httpRequests 时才会发生这种情况。 $httpBackend.flush() 所做的是,它将模拟数据返回到您使用 $httpBackend.when('GET', lc.dbDataUrl).respond 所做的特定请求。

    此外,您不需要创建额外的承诺,这将是一个开销。您可以使用服务函数返回的 promise 本身,而不是自定义承诺,如下所示。

    代码

    it('should resolve with data', function(){
        var data;
    
        srvMock.getDataRevision().then(function(res){
          data = res.success;
        });
    
        $scope.$digest();
        $httpBackend.flush(); //making sure mocked response has been return
        //after .then evaluation only below code will get called.
        expect(data).toEqual(["d1","d2", "d3"]);
    })
    

    【讨论】:

    • 解决方案完美!但是,您介意解释一下测试用例是如何执行的吗?因为httpbackend success 响应总是等于expected data?换句话说,如何(我/我应该)测试从服务promise 返回的response
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2014-06-24
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多