1

我正在尝试使用 Jasmine 2 的新done()回调来测试异步设置的值。

我的测试基于 Jasmine 在他们的文档中给出的示例(http://jasmine.github.io/2.0/upgrading.html#section-Asynchronous_Specs):

it('can set a flag after a delay', function(done) {

  var flag = false,
  setFlag = function() {
    //set the flag after a delay
    setTimeout(function() {
        flag = true;
        done();
    }, 100);
  };

  setFlag();
  expect(flag).toBe(true);
});

我得到的结果是“预期为真”,所以我猜测它没有等待在检查标志值之前调用 done() 回调。

有谁知道为什么这个测试失败了?

谢谢!

4

1 回答 1

4

这是因为您在setTimeout调用后立即运行断言,因此您没有给它足够的时间来调用将标志设置为 true 的回调。下面的代码将起作用(在TryJasmine上运行下面的代码以查看它的行为):

describe('flag delays', function () {
  it('can set a flag after a delay', function(done) {
    var flag = false,
    setFlag = function() {
      //set the flag after a delay
      setTimeout(function() {
          flag = true;
          expect(flag).toBe(true);
          done();
      }, 100);
    };

    setFlag();
  });
});

展望未来,Jasmine 有一种waitsFor方法可以方便地测试计时器。更好的是,Sinon.JS提供了伪造时间的功能,它可以跳过setTimeout调用并验证任何行为,而无需在测试中创建基于持续时间的依赖项。此外,您将能够像在问题中那样在测试结束时编写断言,这将大大提高可读性。

于 2015-01-07T20:36:35.080 回答