具有嵌套角度承诺的Jasmine 2.0测试

时间:2015-03-02 13:43:25

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

我有一个测试,需要运行一个promise,稍后在then处理程序中运行另一个promise return函数。

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

有没有其他方法可以使用Jasmine 2.0测试嵌套的promises?

示例问题:

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();
        })
    });

1 个答案:

答案 0 :(得分:1)

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

  1. prom1()被称为
  2. 创建第一个承诺和超时
  3. 刷新第一个超时,解决第一个承诺
  4. 触发then()块,调用prom2()
  5. 创建第二个承诺和超时
  6. done()被召唤。
  7. 您可以尝试在已经存在的呼叫之后立即添加第二个$timeout.flush();呼叫,这将刷新第二个超时,解决第二个保证,并记录丢失的消息。