【问题标题】:setTimeout test does not run as expectedsetTimeout 测试未按预期运行
【发布时间】:2012-11-08 22:08:36
【问题描述】:

我是 Jasmine 的新手,我对以下测试有疑问:

describe("my test suite", function() {
    it("my testcase", function() {
        var callbackWasCalled = false;
        function callback(){
            callbackWasCalled = true;
        }
        methodToTest(callback);
        expect(callbackWasCalled).toBe(true);
    });
});

在大多数情况下有效,但此代码无效:

methodToTest(callback) {
    setTimeout(function() { callback(); }, 100);
}

这是为什么呢? 当我在回调中添加一个 console.log 时,我看到它被调用了。

【问题讨论】:

  • setTimeout 不会暂停脚本。它异步运行回调,因此expect() 不会被阻塞,因此在callback 被调用之前很久就会被调用。
  • 如果您在调用methodToTest() 之前和之后添加更多console.log() 语句,那么您可以看到代码执行的完整顺序。请注意,setTimeout(callback, 100); 将与 setTimeout(function() { callback(); }, 100); 执行相同的操作 - 您不需要匿名函数,除非您在其中包含其他语句(或者如果您想在 callback() 上使用 .call() 或 .apply() )。
  • 感谢您的回复。 @ user1689607:你是对的。在期望之后的第二个console.log 显示它首先被调用。 @nnnnnn:确实如此,但我的真实案例当然不是那么简单;-)

标签: javascript unit-testing settimeout jasmine


【解决方案1】:

原因是在调用回调之前测试已经完成。尝试 jasmine.Clock 模拟 settimeout 方法。

【讨论】:

  • 我用谷歌搜索了 jasmine.Clock,它看起来像是解决我困境的方法。似乎茉莉花的可能性比我想象的要多得多。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2013-10-28
相关资源
最近更新 更多