Как продлить шутку? - PullRequest
       8

Как продлить шутку?

0 голосов
/ 12 января 2020

В моих модульных тестах (написанных на Typescript, запущенных Jest) я хочу смоделировать два класса, которые имеют общую функциональность. Например, у них обоих есть методы tick() и getTicks(). Мой Jest в настоящее время копирует код для выполнения sh этого, например, так:

const mock1 = jest.fn(() => {
  let ticks = 0;

  return {
    tick: jest.fn(() => {ticks++; }),
    getTicks: jest.fn(() => ticks),
    doSomething: jest.fn()
  }
});

const mock2 = jest.fn(() => {
  let ticks = 0;

  return {
    tick: jest.fn(() => {ticks++; }),
    getTicks: jest.fn(() => ticks),
    doAnotherThing: jest.fn()
  }
});

Теперь я могу сделать:

const mock1Instance = new mock1();
const mock2Instance = new mock2();
mock1Instance.tick();
mock2Instance.getTicks();

Но дублирование кажется глупым. Есть ли способ для меня объявить базовый макет, и просто расширить его, как:

const baseMock = jest.fn(() => {
  let ticks = 0;

  return {
    tick: jest.fn(() => {ticks++; }),
    getTicks: jest.fn(() => ticks),
  }
});

Ответы [ 2 ]

1 голос
/ 14 января 2020

Если ваш baseMock выглядит следующим образом:

const baseMock = () => jest.fn(() => {
  let ticks = 0;

  return {
    tick: jest.fn(() => {ticks++; }),
    getTicks: jest.fn(() => ticks),
  }
});

, вы можете создавать новые объекты со свойствами baseMock и необходимыми новыми свойствами:

const mock1Instance = {
  // note that new is not needed
  ...baseMock(),
  doSomething: jest.fn()
};

const mock2Instance = {
  ...baseMock(),
  doAnotherThing: jest.fn()
};

Или вы можете создать его из baseMock и назначьте его свойство

const mock1Instance = baseMock();
mock1Instance.doSomething = jest.fn();
0 голосов
/ 12 января 2020

В настоящее время я делаю что-то вроде этого, и, похоже, оно работает (по крайней мере, тесты не дают ошибок), но я хотел бы услышать лучшие ответы:

const baseMock = jest.fn(() => {
  let ticks = 0;

  return {
    tick: jest.fn(() => {ticks++; }),
    getTicks: jest.fn(() => ticks),
  }
});

const mock1 = jest.fn(() => {
  return {
    ...new baseMock(),
    doSomething: jest.fn()
  }
});

const mock2 = jest.fn(() => {
  return {
    ...new baseMock(),
    doAnotherThing: jest.fn()
  }
});

const mockInstance = new mock1();
mockInstance.tick(); // works ok
...