#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(). Однако мой подход может быть неверным.