javascript - 服务 promise 不解决 karma

标签 javascript angularjs unit-testing jasmine karma-jasmine

我有一个服务工厂,用于连接数据的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 被调用,但没有被测试中的模拟 promise 解析。如何进行更正?

最佳答案

目前您期望模拟数据存在于 data 中无需冲洗的变量 httpRequest s,但这不会发生,直到你 flush所有httpRequest秒。什么$httpBackend.flush()确实是,它将模拟数据返回给您使用 $httpBackend.when('GET', lc.dbDataUrl).respond 所做的特定请求.

此外,您不需要创建额外的 promise ,这将是一项开销。您可以使用服务函数返回 promise 本身,而不是自定义 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"]);
})

关于javascript - 服务 promise 不解决 karma ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894652/

相关文章:

javascript - 如何获取下拉列表值的总和?

javascript - 自动替换 JavaScript 中的大量内容字符串

node.js - 运行目录中的所有 'test.html' 文件 - mocha-phantomjs

javascript - 将 JavaScript 数组中的相同值分组

javascript - RegEx 替换返回意外结果,没有 .*

javascript - 我如何通过链接函数中的 css 类选择/替换元素组件?

javascript - 启用 AngularJS HTML5 模式后重新加载页面显示 404 错误消息

javascript - 为什么我遇到错误 Cannot find module protobufjs

java - JUnit 测试 - 应该通过预期结果的测试有什么问题?

c++ - 无法编译 bool 连接