茉莉花钟如何工作?

inf*_*rno 11 javascript jasmine jasmine2.0 ecmascript-7

我不想读几个小时的代码来找到相关的部分,但我很好奇茉莉如何实现它的时钟.有趣的是它可以使用同步测试代码测试异步代码.AFAIK与当前node.js一起支持ES5,这是不可能的(异步函数在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();
});
Run Code Online (Sandbox Code Playgroud)

在这里expect(i).toBe(1);应该是一个回调.

m59*_*m59 14

install()函数实际上取代setTimeout了jasmine为您提供更多控制的模拟函数.这使它同步,因为没有实际等待.相反,您可以使用该tick()功能手动移动它,该功能也是同步的.

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

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

  • @ inf3rno对于ajax的东西,你要么想要模拟ajax调用(假设服务器工作),要么进行集成测试,实际上让它是异步的. (2认同)