Как очистить состояние шутки (шпионы, издевательства) между каждым тестом? - PullRequest
0 голосов
/ 11 февраля 2020

У меня проблема, когда шутка не очищает состояние между тестами. Я попытался позвонить restoreAllMocks() в beforeEach() и afterEach(), и это не очистило мою заглушку jest.spyOn(x, 'y').mockImplementation(). Я также попробовал clearAllMocks() и resetAllMocks(), не повезло.

Мой модуль c:

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, чтобы флаг функции возвращал значение true в тесте 2. Однако при запуске тестов я вижу, что флаг также возвращает значение true в тесте 3. Я не ожидал этого, поскольку это означает, что состояние шпиона просачивается между тестами.

Как я могу предотвратить утечку состояния шутки между тестами?

1 Ответ

0 голосов
/ 11 февраля 2020

Это открытая проблема (потенциальная ошибка) в Jest: https://github.com/facebook/jest/issues/7083

По умолчанию Jest не очищает состояние шпиона между тестами. Они могут быть удалены по отдельности, явно удалены в / после теста, который их создает, или вы можете изменить конфигурацию jest для автоматической очистки состояния шпиона между тестами. Следующие свойства могут быть установлены в вашем jest.config.js, чтобы сообщить Jest о необходимости очистки состояния между тестами:

  restoreMocks: true,
  clearMocks: true,
  resetMocks: true,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...