Jest Error when launching tests
I'm building a plugin for Obsidian and I setup my project from their plugin template on GitHub.
To produce a robust plugin, I want to setup unit testing with Jest. Then, I made a simple unit test for my plugin and imported the obsidian
module in the test file. However, when launching the test, it produces the following error :
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)
My configuration
- TypeScript : 4.7.4
- Jest : ^29.4.2
- ts-jest : ^29.0.5
- obsidian : ^1.1.1
IDE : VS Code
package.json
Here are the important informations from the package.json
file :
{
...
"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"
}
}
jest.config.ts
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",
},
};
tsconfig.json
{
"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"
],
}
What I've tried
Changing package manager
I first installed the project using pnpm
. However, as this package manager uses symlinks for managing packages, I thought it would be the cause of the problem.
So I changed and reinstalled all dependencies using npm
. However, the bug still appeared.
I also tried yarn
but the error still there.
Changing config files (the ones above)
I tried lots of changes in the packages I use, the jest.config.ts
or jest.config.js
and the tsconfig.json
files.
Other tries
I tried changing package manager and configuration according to searches I made.
Here are some already built plugins for Obsidian that use Jest for testing. I tried to reproduce their configurations :
The latter is the one I've found a jest config file and tests files that imports obsidian module. I cloned it locally and ran successfully all its tests.
But it didn't work when reproducing configs in my repo.
My searches on this issue
Here are some ressources I read to change the configuration accordingly and resolve this error :
- Jest gives `Cannot find module` when importing components with absolute paths
- Cannot find module from setup-jest.js
- TS cannot find modules
- How do I resolve Jest Mock error "Cannot find module"
- Jest: cannot find module required inside module to be tested (relative path)
- Typescript paths not resolving when running jest?
- Jest, ts-jest, typescript with ES Modules import : cannot find module
- Jest + Typescript + Absolute paths (baseUrl) gives error: Cannot find module
Useful ressources for setting up Jest and TypeScript
Thank you in advance for any help or suggestion to make it working.