javascript - Jasmine 时钟是如何工作的?

标签 javascript jasmine jasmine2.0 ecmascript-2016

我不想花几个小时阅读代码来找到相关部分,但我很好奇 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); 应该在回调中。

最佳答案

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

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

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

关于javascript - Jasmine 时钟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28889562/

相关文章:

javascript - 'click' 上的 jQuery 在更改为 Bootstrap 表后未触发

unit-testing - Visual Studio 环境中 Jasmine 中的 Typescript 测试

javascript - 测试 Angular 组件时的 Jasmine spyOn 服务

javascript - 对 Jasmine spy 的重置调用未返回

java - java 和 javascript 中的正则表达式

javascript - 从对象中检索数据在 Ionic 中不起作用

javascript - 使用 Chrome 检测 Windows 8+ 中的自定义协议(protocol)处理程序

javascript - 如何监视 Jasmine 中的嵌套方法?

javascript - Spec 没有期望 - Jasmine 测试回调函数

javascript - 如何在测试中触发 Ionic 的 Platform.ready?