📜  jasmine.clock().tick() jest 等效 - Javascript (1)

📅  最后修改于: 2023-12-03 15:15:54.385000             🧑  作者: Mango

Jasmine.Clock().tick() 和 Jest 中的等效

简介

Jasmine是一个流行的JavaScript测试框架,而Jest则是一个基于Jasmine的脚手架,用于编写JavaScript测试。这两个框架都提供了一种方法来模拟JavaScript代码中的时间 - Jasmine.Clock().tick()jest中的jest.useFakeTimers()

本文将深入研究这两种方案,比较它们之间的异同,并更深入地了解JavaScript中的时间模拟。

Jasmine.Clock().tick()

Jasmine.Clock().tick()是一个Jasmine函数,允许您手动推进测试中的时间。该函数接受一个整数参数,表示要前进的时间量(以毫秒为单位)。该函数还由Jasmine提供的jasmine.clock()函数返回的对象调用。

下面是一些使用Jasmine.Clock().tick()来测试时间相关代码的示例:

describe('some time-dependent test', function() {
  beforeEach(function() {
    jasmine.clock().install();
  });

  afterEach(function() {
    jasmine.clock().uninstall();
  });

  it('does something after a delay', function() {
    var spy = jasmine.createSpy('callback');
    setTimeout(function() {
      spy();
    }, 1000);
    expect(spy).not.toHaveBeenCalled();
    jasmine.clock().tick(1000);
    expect(spy).toHaveBeenCalled();
  });
});

在此示例中,我们使用Jasmine的jasmine.clock()函数在测试运行时操纵时间。在每个测试用例之前,我们使用install()方法安装时钟模拟,然后在每个测试用例之后,我们使用uninstall()方法卸载时钟模拟。

然后,我们在该测试用例中设置一个超时器,该超时器在1秒后调用回调函数。接下来,我们使用tick()方法模拟了1秒的时间过去,并检查回调函数是否被调用。

Jest 中的等效

Jest是一个使用Jasmine语法编写的JavaScript测试框架,让我们来看看它的时间模拟功能。 Jest使用jest.useFakeTimers()函数来操纵时间,并使用jest.runAllTimers()方法来推进所有挂起的计时器。

下面是一个使用Jest模拟时间的示例:

describe('some time-dependent test', () => {
  // enable Jest fake timers
  beforeEach(() => {
    jest.useFakeTimers();
  });

  // disable Jest fake timers 
  afterEach(() => {
    jest.useRealTimers();
  });

  it('does something after a delay', () => {
    const spy = jest.fn();
    setTimeout(() => {
      spy();
    }, 1000);
    expect(spy).not.toHaveBeenCalled();
    jest.runAllTimers();
    expect(spy).toHaveBeenCalled();
  });
});

在此示例中,我们使用Jest的jest.useFakeTimers()函数启用了假时间。在每个测试用例之后,我们使用jest.useRealTimers()函数禁用假时间。

接下来,我们设置一个超时器,该超时器在1秒钟后调用回调函数,并检查该回调函数是否被称为。最后,我们使用jest.runAllTimers()函数模拟所有计时器的运行。

异同

Jasmine.Clock().tick()和Jest的等效方案之间的主要区别是他们的API。 Jasmine.Clock().tick()需要以毫秒为单位传入时间,而Jest使用jest.runAllTimers()来模拟所有挂起的计时器。

此外,Jest还提供了其他有用的工具来操作计时器 - jest.advanceTimersByTime()jest.advanceTimersToNextTimer()

值得注意的是,Jasmine.Clock().tick()只能在Jasmine测试套件中使用,而Jest可以在任何JavaScript测试中使用。

结论

Jasmine.Clock().tick()和Jest中使用的等效方法提供了一种方便的方式来模拟JavaScript中的时间。它们在API和功能方面有所不同,但它们都非常有用,并帮助您测试依赖于时间的代码。无论您使用哪种方法,您都可以信任自己的代码在各个时间点上都能够如预期地运行。