Я создаю плагин для Obsidian и настраиваю свой проект из их шаблона плагина на GitHub.
Чтобы создать надежный плагин, я хочу настроить модульное тестирование с помощью Jest. Затем я сделал простой модульный тест для своего плагина и импортировал модуль obsidian в тестовый файл. Однако при запуске теста выдает следующую ошибку:
FAIL tests/sync_algorithm.test.ts
● Test suite failed to run
Cannot find module 'obsidian' from 'tests/sync_algorithm.test.ts'
1 | import { syncAlgorithm } from "../src/sync_algorithm";
> 2 | import { TFile } from "obsidian";
| ^
3 |
4 | describe("Sync algorithm", () => {
5 | beforeEach(() => {});
at Resolver._throwModNotFoundError (node_modules/jest-resolve/build/resolver.js:427:11)
at Object.<anonymous> (tests/sync_algorithm.test.ts:2:1)
IDE: код VS
Вот важная информация из файла package.json:
{
...
"scripts": {
...
"test": "jest"
},
...
"devDependencies": {
"@codemirror/state": "^6.2.0",
"@codemirror/view": "^6.8.1",
"@types/jest": "^29.4.0",
"@types/node": "^16.18.12",
"@typescript-eslint/eslint-plugin": "5.29.0",
"@typescript-eslint/parser": "5.29.0",
"builtin-modules": "3.3.0",
"esbuild": "0.17.3",
"eslint": "^8.34.0",
"jest": "^29.4.2",
"obsidian": "^1.1.1",
"ts-jest": "^29.0.5",
"ts-node": "^10.9.1",
"tslib": "2.4.0",
"typescript": "4.7.4"
}
}
export default {
moduleDirectories: ["node_modules", "node_modules/.pnpm", "src"],
modulePaths: ["<rootDir>"],
moduleFileExtensions: [
"js",
"mjs",
"cjs",
"jsx",
"ts",
"tsx",
"json",
"node",
],
moduleNameMapper: {
// obsidian:
// "<rootDir>//node_modules/.pnpm/obsidian@1.1.1_cknrwgf45skglbt6g7kref4zeq/node_modules/obsidian",
"./node_modules/(.*)": "<rootDir>/node_modules/$1",
},
transform: {
"^.+\\.ts$": "ts-jest",
},
};
{
"compilerOptions": {
"baseUrl": ".",
"inlineSourceMap": true,
"inlineSources": true,
"module": "ESNext",
"target": "ES6",
"allowJs": true,
"noImplicitAny": true,
"moduleResolution": "node",
"importHelpers": true,
"isolatedModules": true,
"strictNullChecks": true,
"esModuleInterop": true,
"lib": [
"DOM",
"ES5",
"ES6",
"ES7"
]
},
"include": [
"**/*.ts"
],
}
Сначала я установил проект с помощью pnpm. Однако, поскольку этот менеджер пакетов использует символические ссылки для управления пакетами, я подумал, что это будет причиной проблемы.
Поэтому я изменил и переустановил все зависимости, используя npm. Однако баг все же появился.
Я тоже пробовал yarn но ошибка осталась.
Я пробовал много изменений в используемых мной пакетах, файлах jest.config.ts или jest.config.js и tsconfig.json.
Я попытался изменить диспетчер пакетов и конфигурацию в соответствии с поиском, который я сделал.
Вот некоторые уже созданные плагины для Obsidian, которые используют Jest для тестирования. Я попытался воспроизвести их конфигурации:
Последний — это тот, который я нашел в конфигурационном файле jest и тестовых файлах, которые импортируют модуль obsidian. Я клонировал его локально и успешно провел все его тесты.
Но это не сработало при воспроизведении конфигураций в моем репо.
Вот некоторые ресурсы, которые я прочитал, чтобы соответствующим образом изменить конфигурацию и устранить эту ошибку:
Заранее благодарим вас за любую помощь или предложение, чтобы заставить его работать.
Почему вы не издевались над модулем? Нравиться:
jest.mock('./moduleName') //replace with obsidian
Или части (функция / конструкция и т. д.), которые вы хотите протестировать:
jest.mock('./moduleName', () => ({
<function>: () => jest.fn(),
}));
См. Ручные макеты Jest.io
Пример для obsidian/TFile:
// Create a mock for the TFile class
jest.mock('obsidian', () => {
return {
TFile: jest.fn().mockImplementation(() => {
return {
// Add any methods or properties you want to mock
basename: 'mock-basename.md',
path: 'mock-path',
extension: 'md',
stat: jest.fn(),
};
}),
};
});
Я бы предложил этот подход, потому что вам не нужно тестировать библиотеку. Вы должны стремиться тестировать функциональность своего кода в отрыве от внешних зависимостей. Это связано с тем, что внешние зависимости, такие как библиотеки, могут быть непредсказуемыми, а их поведение может меняться без вашего ведома, что делает ваши тесты ненадежными.
Изучив сообщество Obsidian и Discord (я совершенно забыл начать с этого), я нашел несколько источников, которые интересно исследовать, если вы хотите создать плагин для Obsidian: Obsidian Hub — для разработчиков плагинов для автоматизации тестирования
Я решил проблему, издеваясь над зависимостью с помощью функций Jest.
NB: Спасибо @droebi за ответ!
Спасибо за ваш ответ ! Я новичок в тестировании Jest, и меня не очень устраивали насмешливые концепции. Сейчас я !