2

我有一个使用承诺来解析 json 文件的工厂。它应该只在第一次解析这个文件并在再次调用时返回结果。

这里是工厂

app.factory('getServerConfig', function ($q, $http, serverConfig) {

  return function (fileName) {
    var deferred = $q.defer();

    if (serverConfig.loaded) {
      deferred.resolve("alreadyLoaded");
    } else {
      $http.get(fileName).then(function (result) {
        serverConfig.setConfig(result.data);
        deferred.resolve("loaded");
      }, function (result) {
        deferred.reject();
      });
    }
    return deferred.promise;
  };
})

以及我如何测试它:

it('should say hallo to the World', inject(function(getServerConfig) {
    var promiseResult;

    getServerConfig("server-config.json").then(function (result) {
      promiseResult = result;
    });

    rootScope.$apply();
    expect(promiseResult).toBe('loaded');
}));

不幸的是,看起来 promiseResult 从未设置过。这是一个代码:http ://plnkr.co/edit/uRPCjuUDkqPRAv07G5Nx?p=preview

4

1 回答 1

3

问题是 $httpBackend 需要一个flush()(看看Flushing HTTP requests),所以你可以在你的测试中模仿$http异步行为。

为了解决它,存储一个引用$httpBackend(或再次注入)并在请求完成后调用 $httpBack.flush() 。

看:

it('should say hallo to the World', inject(function(getServerConfig, $httpBackend) {
  var promiseResult;

  getServerConfig("server-config.json").then(function (result) {
    promiseResult = result;
  });

  $httpBackend.flush();
  expect(promiseResult).toBe('loaded');
}));

如果您要$httpBackend在大多数规范中使用,请考虑将其存储在局部变量中,并将其设置为beforeEach.

于 2013-04-05T12:32:57.603 回答