茉莉花时钟是如何工作的?
How jasmine clock works?
我不想阅读几个小时的代码来找到相关部分,但我很好奇 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()
函数实际上用 jasmine 让您可以更好地控制的模拟函数替换了 setTimeout
。这使它成为同步的,因为没有完成实际的等待。相反,您使用 tick()
函数手动将其向前移动,这也是同步的。
假设您有一个内部设置 5 小时超时的函数。 Jasmine 只是替换了 setTimeout
调用,以便在您调用 tick()
时调用回调,以便内部计数器达到或超过 5 小时标记。很简单!
我不想阅读几个小时的代码来找到相关部分,但我很好奇 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()
函数实际上用 jasmine 让您可以更好地控制的模拟函数替换了 setTimeout
。这使它成为同步的,因为没有完成实际的等待。相反,您使用 tick()
函数手动将其向前移动,这也是同步的。
假设您有一个内部设置 5 小时超时的函数。 Jasmine 只是替换了 setTimeout
调用,以便在您调用 tick()
时调用回调,以便内部计数器达到或超过 5 小时标记。很简单!