茉莉花钟如何工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了茉莉花钟如何工作?相关的知识,希望对你有一定的参考价值。

我不想读几个小时的代码来找到相关的部分,但我很好奇茉莉如何实现它的时钟。有趣的是它可以使用同步测试代码测试异步代码。 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();
});

在这里,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小时标记。这很简单!

以上是关于茉莉花钟如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

哈斯克尔。我很困惑这个代码片段是如何工作的

如何修复类型 'AsymmetricMatcher<any>' 不可分配给类型 '() => void'。在茉莉花/开玩笑

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

如何在茉莉花中为可观察的 finally 块编写单元测试 - Angular 2

规范没有期望茉莉花

用茉莉花测试angularjs es6工厂