Angular CLI – Как подобрать файлы .spec.ts вне папки src?

У меня есть проект Angular CLI с NgModule, расположенным за пределами папки /src (в конечном итоге этот NgModule будет упакован как модуль npm, но пока я просто оставляю его за пределами /src).

Я пытаюсь написать модульные тесты для этого NgModule, но ng test, похоже, не собирает .spec.ts файлов вне папки /src.

Я попытался изменить путь в /src/test.ts:

// Original
const context = require.context('./', true, /\.spec\.ts$/);

// Does not work
const context = require.context('../', true, /\.spec\.ts$/);

// Does not work
const context = require.context('/absolute/path/to/ngmodule', true, /\.spec\.ts$/);

Но получаю ошибку: Module build failed: Error: /absolute/path/to/file.spec.ts is not part of the compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property.

Я также попытался добавить путь к моему NgModule в свойстве include tsconfig.spec.json:

"include": [
  "../my-ng-module/**/*.spec.ts",  // Added this
  "**/*.spec.ts",
  "**/*.d.ts"
]

Но никакого успеха. Любые идеи?


person AngularChef    schedule 18.11.2017    source источник


Ответы (2)


В tsconfig.spec.json

 "include": [
    "../*.spec.ts", // your spec file location parent of src or ../yourpath/
    "**/*.spec.ts",
    "**/*.d.ts"
  ] 

В test.ts

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

 const context1 = require.context('./', true, /\.spec\.ts$/);//
 const context = require.context('../', true, /app\.component\.spec\.ts$/);//
 context.keys().map(context);
 context1.keys().map(context1);

Когда вы находитесь в родительской папке src, тот же контекст подбирает файлы, которые находятся в node_modules, поэтому нам нужно упомянуть имя spec.ts.

Файлы spec.ts, которые находятся в src, будут работать как и раньше введите здесь описание изображения

Спецификация приложения находится в родительской папке src, а спецификация игры находится в папке src.

Если вы хотите указать только корневой каталог и оттуда выбрать все файлы спецификаций, мы даем другое соглашение об именах, которое отличается от файлов спецификаций в node_modules. Скажите, какие из них находятся вне src как yourapp.componentout.spec.ts, а какие находятся внутри insideapp.componentin.spec.ts, и вы можете указать один путь вместо двух каталогов.

const context = require.context('../', true, /out\.spec\.ts$|in\.spec\.ts$/);//
context.keys().map(context);

или другим способом следуйте соглашению об именах для файлов, которые находятся за пределами src только и поместите

 const context1 = require.context('./', true, /\.spec\.ts$/);//
 const context = require.context('../', true, /out\.spec\.ts$/);//
 context.keys().map(context);
 context1.keys().map(context1);

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

По сути, мы можем изменить приведенное ниже в соответствии с нашими потребностями.

  require.context(directory, useSubdirectories = false, regExp = /^\.\//)

Надеюсь это поможет !!!

Ссылка: https://webpack.js.org/guides/dependency-management/#require-context

person Ampati Hareesh    schedule 18.11.2017
comment
Отличный ответ! Я бы никогда не подумал о дополнительном контексте в tests.ts, я нигде не видел документации по этому поводу. Большое спасибо за публикацию - person Drenai; 08.03.2018
comment
:) Спасибо! я рад, что это помогло вам :) - person Ampati Hareesh; 11.03.2018
comment
Что заметил, так это то, что вы не можете использовать переменные в require.context, так как кажется, что webpack анализирует их, а не интерпретирует?! - person mPrinC; 23.01.2020

Следующая команда поможет

ng test --include='src/app/modulefolder/**/*.spec.ts'
person Venkatesh Muniyandi    schedule 29.06.2021