【问题标题】:Jasmine 2.0 Test with Nested Angular PromiseJasmine 2.0 使用嵌套 Angular Promise 进行测试
【发布时间】:2015-03-02 13:43:24
【问题描述】:

我有一个测试需要运行一个承诺,然后在其then 处理程序中运行另一个承诺返回函数。

第一个 Promise 被解析,并且成功调用下一个返回 Promise 的函数。但是,第二个承诺的 then 处理程序永远不会触发。

还有其他方法可以使用 Jasmine 2.0 测试嵌套的 Promise 吗?

示例问题:

describe("nested promise suite", function () {
        var prom1 = function () {
            var deferred = $q.defer();
            $timeout(function () {
                deferred.resolve('prom1');
            }, 500)
            return deferred.promise;
        };

        var prom2 = function () {
            var deferred = $q.defer();
            $timeout(function () {
                deferred.resolve('prom2');
            }, 500);
            return deferred.promise;
        };

        iit("nested promise test", function (done) {
            prom1()
                .then(function (result) {
                    console.log('prom1 result ', result);
                    prom2()
                        .then(function (result2) {
                            console.log('prom2 result ', result2);
                        })
                        .finally(function() {
                            console.log('you did it');
                        })
                })
                .finally(done);  //this causes promise one to resolve properly but unsure of how to make the second promise resolve properly
            $timeout.flush();
        })
    });

【问题讨论】:

标签: javascript timeout jasmine karma-jasmine angular-promise


【解决方案1】:

我不确定这是否也是您的原始代码中的问题,但在此示例中,您的第二个 console.log 不会触发,因为prom2 在第一个被刷新后添加了一个新的超时。来自prom2 的承诺然后等待这个新的超时刷新,这永远不会发生:

  1. prom1() 被调用
  2. 创建第一个承诺和超时
  3. 第一个超时被刷新,解决第一个承诺
  4. then() 块被触发,调用prom2()
  5. 创建第二个承诺和超时
  6. done() 被调用。

您可以尝试在已经存在的调用之后添加第二个 $timeout.flush(); 调用,这将刷新第二个超时,解决第二个承诺,并记录丢失的消息。

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2017-06-10
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多