【问题标题】:AngularJS : Need help to unit test a factory with promiseAngularJS:需要帮助来对有承诺的工厂进行单元测试
【发布时间】:2013-04-05 12:02:20
【问题描述】:

我有一个使用 promise 来解析 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

【问题讨论】:

    标签: unit-testing angularjs promise


    【解决方案1】:

    问题在于 $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

    【讨论】:

    • 啊,谢谢。我确实使用了 flush 但在 beforeEach 函数中,这就是它不起作用的原因。谢谢!
    • 您将如何测试依赖于该服务的控制器?谢谢。
    • 测试你的控制器的最好方法是模拟这个服务并返回一个已知的承诺,你可以控制解决时间。如果您不想模拟它,只需以相同的方式调用$httpBackend.flush() 并检查控制器是否按照您期望的方式做出反应。创建一个新问题(这与本主题无关)并发布一些代码,以便我可以为您提供更多帮助。
    • rootScope.apply() 真的有必要吗?
    • 感谢@KeesdeKooter。确实可能没有必要,因为$http 已经invokes a $rootScope.$apply after resolving he promises。将从响应中删除。
    猜你喜欢
    • 2016-10-25
    • 2014-09-27
    • 2013-05-10
    • 2010-12-05
    • 2011-08-12
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多