Конфигурация / ошибка Jest - не удается найти модуль «<имя модуля>» из «<имя тестового файла>»

Ошибка Jest при запуске тестов

Я создаю плагин для 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)

Моя конфигурация

  • Машинописный текст: 4.7.4
  • Шутка: ^ 29.4.2
  • ц-шутка : ^ 29.0.5
  • обсидиан: ^ 1.1.1

IDE: код VS

Пакет.json

Вот важная информация из файла 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"
  }
}

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"
    ],
}

Что я пробовал

Смена менеджера пакетов

Сначала я установил проект с помощью pnpm. Однако, поскольку этот менеджер пакетов использует символические ссылки для управления пакетами, я подумал, что это будет причиной проблемы.

Поэтому я изменил и переустановил все зависимости, используя npm. Однако баг все же появился.

Я тоже пробовал yarn но ошибка осталась.

Изменение файлов конфигурации (те, что выше)

Я пробовал много изменений в используемых мной пакетах, файлах jest.config.ts или jest.config.js и tsconfig.json.

Другие попытки

Я попытался изменить диспетчер пакетов и конфигурацию в соответствии с поиском, который я сделал.

Вот некоторые уже созданные плагины для Obsidian, которые используют Jest для тестирования. Я попытался воспроизвести их конфигурации:

Последний — это тот, который я нашел в конфигурационном файле jest и тестовых файлах, которые импортируют модуль obsidian. Я клонировал его локально и успешно провел все его тесты.

Но это не сработало при воспроизведении конфигураций в моем репо.

Мои поиски по этому вопросу

Вот некоторые ресурсы, которые я прочитал, чтобы соответствующим образом изменить конфигурацию и устранить эту ошибку:

Полезные ресурсы по настройке Jest и TypeScript

Заранее благодарим вас за любую помощь или предложение, чтобы заставить его работать.

Принципы SOLID в JavaScript с примерами
Принципы SOLID в JavaScript с примерами
Принцип единой ответственности подразумевает то, что:
Типы привязки данных в Angular
Типы привязки данных в Angular
Привязка данных автоматически поддерживает страницу в актуальном состоянии на основе состояния вашего приложения. Вы используете привязку данных,...
3 паттерна TypeScript, которые я использую в своей повседневной работе
3 паттерна TypeScript, которые я использую в своей повседневной работе
В TypeScript 2.0 в язык был добавлен модификатор readonly.
Мифический Angular - Миф Angular: стили компонентов
Мифический Angular - Миф Angular: стили компонентов
Это очень короткая и интересная для меня тема. В Angular каждый компонент может иметь свои собственные прикрепленные стили. Стили могут находиться в...
Подсказка RxJS [filter, skipWhile]
Подсказка RxJS [filter, skipWhile]
Эта подсказка описывает разницу между операторами filter и skipWhile из библиотеки RxJS .
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
1
0
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Почему вы не издевались над модулем? Нравиться:

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(),
      };
    }),
  };
});

Я бы предложил этот подход, потому что вам не нужно тестировать библиотеку. Вы должны стремиться тестировать функциональность своего кода в отрыве от внешних зависимостей. Это связано с тем, что внешние зависимости, такие как библиотеки, могут быть непредсказуемыми, а их поведение может меняться без вашего ведома, что делает ваши тесты ненадежными.

Спасибо за ваш ответ ! Я новичок в тестировании Jest, и меня не очень устраивали насмешливые концепции. Сейчас я !

LBF38 15.02.2023 16:02

Изучив сообщество Obsidian и Discord (я совершенно забыл начать с этого), я нашел несколько источников, которые интересно исследовать, если вы хотите создать плагин для Obsidian: Obsidian Hub — для разработчиков плагинов для автоматизации тестирования

Я решил проблему, издеваясь над зависимостью с помощью функций Jest.

NB: Спасибо @droebi за ответ!

Другие вопросы по теме