模拟Angular中的承诺:'那么'不开火

Mocking up a promise in Angular: 'then' not firing?

本文关键字:开火 那么 Angular 承诺 模拟      更新时间:2023-10-23

我试图在一些Angular单元测试中模拟一个承诺。

我不明白为什么下面的then()部分永远不会启动。有人能提出建议吗?

beforeEach(inject(function ($controller, $rootScope, $q) {
  scope = $rootScope.$new();
  var mockFactory = {
    getData: function() { 
      var deferred = $q.defer();
      deferred.resolve({data: [1,2,3], widget: null});
      return deferred.promise;
    }
  };
  mockFactory.getData()
    .then(function (response) {
      console.log('mockFactory', response);
    });
  }));

我不确定这个问题是否相关。

Angular的promise库$q与$rootScope集成在一起。在下一轮Angular摘要循环之前,不会应用对promise的解析。这在测试时是一个真正的难题,因为您必须在解析promise之后通过调用$rootScope.$apply()来强制执行它。

你的例子有点刺耳,而且不完整。在你还承诺之前,你也在解决这个问题。我不知道你到底想做什么,我也不会猜测。但我认为下面这样的东西会得到你想要的console.log。

beforeEach(inject(function ($controller, $rootScope, $q) {
    scope = $rootScope.$new();
    var deferred;
    var mockFactory = {
        getData: function() { 
            deferred = $q.defer();
            return deferred.promise;
        }
    };
    mockFactory.getData()
        .then(function (response) {
            console.log('mockFactory', response);
        });
    deferred.resolve({data: [1,2,3], widget: null});
    $rootScope.$apply();
}));

我做了一个单元测试angularjs承诺的工作示例

它在这里:plunkr

我在projectpoppytock上写了一篇关于这个主题的博客

干杯!祝你好运,答应嘲笑。