【问题标题】:How do I clear jest state (spies, mocks) between each test?如何在每次测试之间清除开玩笑状态(间谍、模拟)?
【发布时间】:2020-05-26 08:58:49
【问题描述】:

我遇到了一个问题,即 jest 没有在测试之间清除状态。我尝试在beforeEach() 和afterEach() 中调用restoreAllMocks(),但这并没有清除我的jest.spyOn(x, 'y').mockImplementation() 存根。我也试过clearAllMocks() 和resetAllMocks(),没有运气。

我的规范模块:

function mockFeatureFlag(flagToMock: Flag) {
  jest.spyOn(FeatureFlags, 'singleton').mockImplementation(
    () =>
      ({
        getFeatureFlag: (flag: Flag) =>
          new Promise(resolve => {
            if (flag === flagToMock) {
              resolve(true);
            } else {
              resolve(false);
            }
          }),
      } as any),
  );
}

  describe('bufferMinutesForDistance', () => {
    it('for small distances uses min buffer of 3h', async () => {
      const minutes = await util.bufferMinutesForDistance(1);
      expect(minutes).toBe(3 * 60);
    });

    it('for small distances when HALF_GHOST_BUFFER flag is true uses min buffer of 3h', async () => {
      mockFeatureFlag(Flag.HALF_GHOST_BUFFER);
      const minutes = await util.bufferMinutesForDistance(1);
      expect(minutes).toBe(3 * 60);
    });

    it('for long distances uses 12h buffer', async () => {
      const minutes = await util.bufferMinutesForDistance(1000);
      expect(minutes).toBe(12 * 60);
    });

    it('for long distances when HALF_GHOST_BUFFER flag is true cuts 12h buffer by half', async () => {
      mockFeatureFlag(Flag.HALF_GHOST_BUFFER);
      const minutes = await util.bufferMinutesForDistance(1000);
      expect(minutes).toBe(6 * 60);
    });
  });

这里有 4 个测试。在测试 1 和 3 中,我没有明确地模拟功能标志以返回 true,我希望它返回 false(功能标志默认为 false)。在这里,我调用mockImplementation 使功能标志在测试 2 中返回 true。但是,在运行测试时,我看到标志在测试 3 中也返回 true。我没想到会这样,因为这意味着间谍状态在测试之间泄漏。

如何防止 jest 在测试之间泄漏状态?

【问题讨论】:

    标签: javascript unit-testing testing jestjs


    【解决方案1】:

    这是 Jest 中的一个未解决问题(潜在错误):https://github.com/facebook/jest/issues/7083

    默认情况下,Jest 不会在测试之间清除间谍状态。它们可以在创建它们的测试中/之后单独显式删除,或者您可以更改您的 jest 配置以自动清除测试之间的间谍状态。可以在您的jest.config.js 中设置以下属性来告诉 Jest 清除测试之间的状态:

      restoreMocks: true,
      clearMocks: true,
      resetMocks: true,
    

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多