Смоделируйте константу TypeScript, отличающуюся в каждом тесте Jest

Я изо всех сил пытаюсь издеваться над константой с Jest для каждого теста. У меня он работает с кодом ниже, но макет статичен - я не могу издеваться над ним по-разному для каждого теста.

Код:

// allowList.ts
export const ALLOW_LIST = {
  '1234': true
};
// listUtil.ts
import { ALLOW_LIST } from './allowList.ts';

export const checkList = (id: string) => {
  if (ALLOW_LIST[id]) return true;
  return false;
};

Тест (рабочий):

// listUtil.test.ts
import { checkList } from './listUtil';

jest.mock('./listUtil', () => {
  return {
    '5678': true
  };
});

test('in list', () => {
  expect(checkList('5678')).toBe(true);
});
test('not in list', () => {
  expect(checkList('1234')).toBe(false);
});

Что хотелось бы (не работает):

// listUtil.test.ts
import { checkList } from './listUtil';

test('in list', () => {
  jest.mock('./listUtil', () => {
    return {
      '5678': true
    };
  });
  expect(checkList('5678')).toBe(true);
});
test('not in list', () => {
  jest.mock('./listUtil', () => {
    return {
      '9123': true
    };
  });
  expect(checkList('1234')).toBe(false);
});

Возможно ли то, что я пытаюсь сделать? Этот пост очень похож и, кажется, работает при имитации функций, но у меня та же проблема, что и у комментаторов принятого ответа. Думаю, я просто не понимаю, как Jest издевается под капотом. Я считаю, что рабочая версия работает, потому что макет поднят и в основном перезаписывает реальную реализацию, но я не уверен, как и смогу ли я добиться этого в каждом тесте.

Я думаю, что одним из вариантов было бы открыть ALLOW_LIST через функцию:

// allowList.ts
const ALLOW_LIST = {
  '1234': true
};
export const getAllowList = () => ALLOW_LIST;

и издеваюсь над этим, но мне интересно, нужно ли это.


person Tim S    schedule 14.01.2021    source источник


Ответы (1)


Вы можете использовать jest.doMock(moduleName, factory, options) издеваться над модулем по-разному для каждого теста.

E.g.

allowList.ts:

export const ALLOW_LIST = {
  '1234': true,
};

listUtil.ts:

import { ALLOW_LIST } from './allowList';
console.log('ALLOW_LIST: ', ALLOW_LIST);

export const checkList = (id: string) => {
  if (ALLOW_LIST[id]) return true;
  return false;
};

listUtil.test.ts:

describe('65712158', () => {
  beforeEach(() => {
    jest.resetModules();
  });
  it('should in list', () => {
    jest.doMock('./allowList', () => ({ ALLOW_LIST: { 5678: true } }));
    const { checkList } = require('./listUtil');
    expect(checkList('5678')).toBeTruthy();
  });

  it('should not in list', () => {
    jest.doMock('./allowList', () => ({ ALLOW_LIST: { 9123: true } }));
    const { checkList } = require('./listUtil');
    expect(checkList('1234')).toBeFalsy();
  });
});

результат модульного теста:

 PASS  examples/65712158/listUtil.test.ts
  65712158
    ✓ should in list (2517 ms)
    ✓ should not in list (2 ms)

  console.log
    ALLOW_LIST:  { '5678': true }

      at Object.<anonymous> (examples/65712158/listUtil.ts:2:9)

  console.log
    ALLOW_LIST:  { '9123': true }

      at Object.<anonymous> (examples/65712158/listUtil.ts:2:9)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |     100 |      100 |     100 |     100 |                   
 listUtil.ts |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        5.03 s
person slideshowp2    schedule 14.01.2021
comment
Потрясающе - спасибо! Я действительно пытался это сделать, но пропустил операторы const { checkList } = require('./listUtil'); - person Tim S; 14.01.2021