在Jasmine 1.3中运行/等待之后完成Promise

时间:2016-12-16 16:44:50

标签: javascript jasmine jasmine-node

我正在使用jasmine-node 1.14.5,它下面使用了jasmine 1.3,我遇到了让runs/waitFor与Promises正常工作的问题。

在某些测试中,我希望runs/waitFor等待特定情况发生,当它发生时,履行我返回的承诺。但是,当我尝试构造一个传递function(success, fail)参数的Promise时,runs/waitFor内的所有代码都不会被调用。但是,如果Promise直接解决,它就可以工作。任何想法前一个选项都不起作用?

举一些例子,以下工作正常:

  it("should support async execution of test preparation and expectations", function(done) {
    var p = Promise.resolve("boo")
      .then(function() {
        var p2 = Promise.resolve("whatever");

        runs(function() {
          flag = false;
          value = 0;
          intId = setInterval(function() {
            console.log(value);
            if (++value == 3) { clearInterval(intId); flag = true; }
          }, 500);
        });

        waitsFor(function() {
          return flag;
        }, "The Value should be incremented", 5000);

        runs(function() {
          expect(value).toEqual(3);
        });

        return p2;
      });
    p.then(function() {
      done();
    }).catch(function(err) {
      done(err);
    });
  });

但另一方面,这不起作用,因为虽然调用runs/waitsFor没有问题,但内部的回调不会:

  it("should support async execution of test preparation and expectations", function(done) {
    var p = Promise.resolve("boo")
      .then(function() {
        return new Promise(function (fulfil, reject) {
          runs(function () {
            flag = false;
            value = 0;
            intId = setInterval(function () {
              console.log(value);
              if (++value == 3) {
                clearInterval(intId);
                flag = true;
              }
            }, 500);
          });

          waitsFor(function () {
            return flag;
          }, "The Value should be incremented", 5000);

          runs(function () {
            expect(value).toEqual(3);
            fulfil();
          });
        });
      });
    p.then(function() {
      done();
    }).catch(function(err) {
      done(err);
    });
  });

我也尝试了下面的机会,但也没有用,它的行为与上一个例子相同:

  it("should support async execution of test preparation and expectations", function(done) {
    var p = Promise.resolve("boo")
      .then(function() {
        var outerFulfil;
        var outerReject;
        var p2 = new Promise(function(fulfil, reject) {
          outerFulfil = fulfil;
          outerReject = reject;
        });

        runs(function() {
          flag = false;
          value = 0;
          intId = setInterval(function() {
            console.log(value);
            if (++value == 3) { clearInterval(intId); flag = true; }
          }, 500);
        });

        waitsFor(function() {
          return flag;
        }, "The Value should be incremented", 5000);

        runs(function() {
          expect(value).toEqual(3);
          outerFulfil();
        });

        return p2;
      });
    p.then(function() {
      done();
    }).catch(function(err) {
      done(err);
    });
  });

知道怎么解决吗?虽然第一个示例有效,但它的行为并不像我想要的那样,因为我只希望在执行waitsFor之后的断言时履行承诺。

干杯, 盖尔德

1 个答案:

答案 0 :(得分:0)

我最终放弃了run / waits,而是做了一个基于时间的递归Promise循环,例如。

function waitUntil(expectF, cond, op) {
  var now = new Date().getTime();

  function done(actual) {
    return cond(actual)
      && new Date().getTime() < now + MAX_WAIT;
  }

  function loop(promise) {
    exports.sleepFor(100); // brief sleep

    // Simple recursive loop until condition has been met
    return promise
      .then(function(response) {
        return !done(response)
          ? loop(op())
          : response;
      })
      .catch(function() {
        return loop(op());
      });
  }

  return loop(op())
    .then(function(actual) {
      expectF(actual);
    });
}

op是一个返回Promise的操作。

例如,我想等到特定数量的节点加入集群:

function waitUntilView(expectNumMembers, nodeName) {
  return waitUntil(
    function(members) { expect(members.length).toEqual(expectNumMembers); },
    function(members) { return _.isEqual(expectNumMembers, members.length); },
    getClusterMembers(nodeName)
  );
}