15

我不想花几个小时阅读代码来找到相关部分,但我很好奇 jasmine 如何实现它的时钟。它的有趣之处在于它可以使用同步测试代码来测试异步代码。AFAIK,使用当前支持 ES5 的 node.js,这是不可能的(异步函数在 ES7 中定义)。它是否使用 estraverse 之类的东西解析 js 代码并从同步代码构建异步测试?

只是我所说的一个例子:

it("can test async code with sync testing code", function () {
    jasmine.clock().install();

    var i = 0;
    var asyncIncrease = function () {
        setTimeout(function () {
            ++i;
        }, 1);
    };

    expect(i).toBe(0);
    asyncIncrease();
    expect(i).toBe(0);
    jasmine.clock().tick(2);
    expect(i).toBe(1);

    jasmine.clock().uninstall();
});

在这里expect(i).toBe(1);应该在回调中。

4

1 回答 1

18

install()函数实际上替换setTimeout为 jasmine 为您提供更多控制的模拟函数。这使它同步,因为没有完成实际的等待。相反,您可以使用该功能手动将其向前移动,该tick()功能也是同步的。

查看源代码:https ://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

假设您有一个内部设置超时 5 小时的函数。Jasmine 只是替换了该setTimeout调用,以便在您调用时调用回调,tick()以便内部计数器达到或超过 5 小时标记。这很简单!

于 2015-03-05T23:12:04.193 回答