茉莉花异步测试

Jasmine Async Testing

我正在尝试使用 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);
});

我正在获取结果 "Expected false to be true",所以我猜测它没有等待 done() 回调被调用,然后才检查标志的值。

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

谢谢!

这是因为您在 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 method to facilitate testing timers. Even better, Sinon.JS provides functionality for faking times,可以跳过 setTimeout 调用并验证任何行为,而无需在测试中创建基于持续时间的依赖项。此外,您将能够像在问题中所做的那样在测试结束时编写断言,这将大大提高可读性。