【问题标题】:Mocking up a promise in Angular: 'then' not firing?在 Angular 中模拟一个承诺:'then' 不会触发?
【发布时间】:2013-11-25 16:13:51
【问题描述】:

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

我不明白为什么下面的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);
    });

  }));

我不确定this issue is related

【问题讨论】:

  • 你可能想调用promise!! return deferred.promise();
  • 我不确定这是做什么的,但它失败了 Uncaught SyntaxError: Unexpected token return

标签: javascript angularjs


【解决方案1】:

Angular 的 promise 库 $q 与 $rootScope 集成。直到下一轮 Angular 摘要循环才会应用对承诺的解决方案。这是测试时的一个真正的陷阱,因为您必须在解决承诺后通过调用 $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

我在 projectpoppycock

上写了一篇关于此主题的随附博客

干杯!祝你好运承诺嘲笑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2013-11-25
    • 1970-01-01
    • 2021-02-12
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多