【问题标题】:Jasmine Async TestingJasmine 异步测试
【发布时间】:2015-01-07 20:31:14
【问题描述】:

我正在尝试使用 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() 回调。

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

谢谢!

【问题讨论】:

    标签: javascript unit-testing jasmine jasmine2.0


    【解决方案1】:

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

    【讨论】:

    • 啊,我明白了。我希望 Jasmine 2 给了 expect() 一些额外的权力,看看它是否应该等待 done() 回调。看起来像将 done 作为参数添加到 it() 只是告诉它等到 done() 被调用,然后再继续下一个测试。对吗?
    • Sinon.js 看起来很酷。我也遇到了 Jasmine.tick,它看起来也可以模拟 setTimeouts:jasmine.github.io/2.0/…
    • @corbin 没错。我在我的 Mocha 测试中使用了它,因为该框架支持相同的方法。对于我的异步内容,我使用了假计时器(诚然,我几天前才遇到过!)和Promises,可以直接返回给 Mocha 测试运行器;这意味着您甚至不需要调用done!不过,我不确定 Karma 的行为是否相同。
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2013-06-28
    • 2021-01-18
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多