【问题标题】:setInterval works setTimeout doesn'tsetInterval 有效 setTimeout 无效
【发布时间】:2023-03-21 09:39:01
【问题描述】:

我目前正在使用 APM 1.6.0、Node 0.10.40 和 Jasmine 1.3 为 Atom 包编写异步规范。不幸的是,我无法让setTimeout 工作。

由于 Jasmine 1.3 使用顺序 runs-blocks 来允许异步测试,我试图从文档中理解示例。

事实证明,setTimeout-callback 从未被调用过。

在寻找可能发生这种情况的原因时,我将setTimeout-statement 重命名为setInterval(因为两个函数具有相同的签名)。

如果我执行以下代码

describe('an asynchronous test', () => {
    it('should do some async stuff', () => {
        runs(() => {
            setInterval(() => {
                console.info('async');
            }, 75);

            setTimeout(() => {
                console.info('async2');
            }, 75);
        });
        waitsFor(() => {
            return false;
        }, 'missing events'); // will wait ~5 seconds.
    });
});

我得到以下输出:

async
async
async
...

为什么setInterval-function 工作正常,而setTimeout 完全不工作?

编辑:问题的第一个版本没有提到规范是在 Atom 环境中运行的。请原谅。

【问题讨论】:

  • Works for me(也在节点上)
  • setTimeout 仅在 75 毫秒后执行一次。您是否可能只是缺少输出?它将位于控制台的顶部。也许尝试将时间设置为更高的数字?
  • 一些测试框架要求你以某种方式识别异步测试,你确定你为 Jasmine 正确地做到了这一点吗?
  • 对不起,我错过了添加对 Atom 环境的引用。整个测试等待约 5 秒。我肯定不会错过任何活动。
  • @T.J.Crowder 测试不起作用,因为没有调用超时。 Jasmine 1.3 需要满足在 waitsFor 语句中设置的依赖项。

标签: javascript node.js atom-editor


【解决方案1】:

我终于通过这个Post找到了解决方案。它导致spec-helper 文件,其中setTimeout 被Jasmine-spy 存根。

要使setTimeout 再次工作,必须删除带有jasmine.unspy() 的间谍。在调用setTimeout 后,可以使用spyOn() 重新激活间谍。

以下几行通过我上面的示例说明了这一点:

runs(() => {
    // disable spy
    jasmine.unspy(window, 'setTimeout');

    setTimeout(() => {
        console.info('async2');
    }, 75);

    // reenable spy
    spyOn(window, 'setTimeout')
        .andCallFake(window.fakeSetTimeout);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多