Javascript 茉莉花钟是如何工作的?

Javascript 茉莉花钟是如何工作的?,javascript,jasmine,jasmine2.0,ecmascript-2016,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().inst

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

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

请参阅源代码:


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

因此,对于真正的异步代码(例如,通过db连接?@inf3rno)来说,这是行不通的。对于ajax之类的东西,您可能希望模拟ajax调用(假设服务器工作),或者对于集成测试,实际上让它是异步的。Ok。我正在为ES5开发一个异步框架,这就是为什么我问这个问题。谢谢!:-)那么,安装Jasmine时钟时设置的所有超时将在卸载时钟时删除?卸载后它们不会再次开始运行吗?