Как издеваться над классом Es6 с помощью Jest?

#typescript #jestjs #mocking

#typescript #jestjs #издевательство

Вопрос:

Я пытаюсь смоделировать класс, используя jest.mock с заводским параметром. Однако, похоже, он работает не так, как ожидалось.

Я получил сообщение об ошибке «TypeError: ProjectSettings.getProjectDir не является функцией«.

Я думаю, что я правильно следил за документацией, однако мог пропустить что-то основное. https://jestjs.io/docs/en/es6-class-mocks . Не могли бы вы сказать мне, чего мне не хватает? Заранее спасибо.

Он отлично работает, когда я делаю

 
  const projectSettings = {
    getProjectDir: jest.fn(),
    setProjectDir: jest.fn()
  };

 

Не работает:

 const projectSettings = jest.mock('./projectSettings',()=>{
  return function() {
    return {
        getProjectDir: jest.fn(),
        setProjectDir: jest.fn()
    }
  }
});
 

тест

  test('Set Project Directory Menu click should open dialog', async () => {
    const setDirMenuItem = subMenu.getSetProjectDirSubMenu(
      <any>mainWindow,
      <any>projectSettings
    );
    await setDirMenuItem.click();
    expect(dialog.showOpenDialog).toHaveBeenCalledTimes(1);
  });
 

Тестируемый код

 export const getSetProjectDirSubMenu = (
  mainWindow: BrowserWindow,
  projectSettings: ProjectSettings
) => ({
  label: 'Set Project Directory',
  click: async () => {
    const result = await dialog.showOpenDialog(mainWindow, {
      properties: ['openDirectory'],
      defaultPath: projectSettings.getProjectDir()
    });

    if (result.filePaths[0]) {
      projectSettings.setProjectDir(result.filePaths[0]);
      mainWindow.webContents.send('PROJECT_DIRECTORY_SET', {});
    }
  }
});
 

Комментарии:

1. Почему бы вам не продолжать использовать то, что работает? Вам не нужно издеваться над параметрами через систему модулей, и код, который вы тестируете, понятия не имеет, экземпляр ли это класса или ванильный объект.

2. Спасибо @jonrsharpe. вы правы. Я должен использовать то, что работает. Я пытался лучше понять, как работает метод jest.mock(). Однако мой подход может быть неверным.