茉莉花异步测试

时间:2015-01-07 20:31:15

标签: javascript unit-testing jasmine jasmine2.0

我正在尝试使用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 true”,所以我猜测它不会在检查标志值之前等待调用done()回调。

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

谢谢!

1 个答案:

答案 0 :(得分:4)

这是因为您在调用setTimeout后立即运行您的断言,因此您没有给它足够的时间来调用将flag设置为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.JSfaking times提供了功能,可以跳过setTimeout调用并验证任何行为,而无需在测试中创建基于持续时间的依赖项。此外,您可以在测试结束时编写断言,就像您在问题中所做的那样,这将大大提高可读性。