Как смоделировать глобальную переменную в jest перед выполнением импорта? - PullRequest
0 голосов
/ 07 марта 2020

Значение эпохи установлено рано, и функция закрыта, поскольку я не хочу восстанавливать значение эпохи.

/* index.js */
const epoch = Date.now()

function appVersion() {
  console.log(epoch)
}

export { appVersion }

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, как я высмеиваю глобальный объект Date в моем тестовом файле, этот возвращает возвращаемое значение, не имитируемое, поскольку импорт выполняется первым.

Как я могу смоделировать Date.now () в моем тестовом файле?

Альтернативой, которую я использовал сейчас, является использование Date.now () в отдельном файле и jest.mock импортированного файла

/* epoch.js */
const epoch = Date.now()

export = { epoch }
/* index.test.js */
import { appVersion } from './app-version'

jest.mock('./epoch', () => ({
  epoch: '11111111'
})

1 Ответ

1 голос
/ 07 марта 2020

Обычный шаблон для работы с датами и другими недетерминированными значениями c (например, Math.random()) - передать их в качестве аргумента и присвоить им значение по умолчанию.

const defaultEpoch = Date.now();

function appVersion(epoch = defaultEpoch) {
  console.log(epoch)
}

export { appVersion }

Таким образом, код работает, как и ожидалось, но теперь у вас есть возможность передать значение c при тестировании, чтобы сделать его детерминированным c:

import { appVersion } from './app-version'

it('uses epoch value for appVersion', () => {
  const mockEpoch = '11111111';
  const version = appVersion(mockEpoch);
  expect(version).toBe('11111111');
};
...