无法正确测试Angular + Karma中不属于项目目录的文件

我具有以下文件结构:

  • projects
    • myproj-Angular应用
    • myproj-lib-角库
  • shared-共享代码,在应用程序和库中都使用

两个项目(App和Lib)都是使用Angular CLI构建的(到目前为止,除了codeCoverage选项之外,angular.json均未更改)。我无法运行shared目录中的测试:

  • 对于该应用,测试可以正常运行,但是覆盖范围仅包括项目文件(位于projects/myproj/src下的文件)
  • 对于库测试,它总是在TypeScript编译中缺少Error: \TRUNCATED_PATH\shared\components\component-dir\component.ts的情况下中断

我认为该应用程序的问题在于,尽管测试(甚至最终报告)包括这些内容,但覆盖率报告程序仍未看到shared目录(它仅显示来自src该项目)

对于库,我想这是有关Karma如何解析路径以便Typescript可以看到它们的事情。

我的test.ts文件(仅添加了其他路径):

// This file is required by karma.conf.js and loads recursively all the .spec and framework files

import 'zone.js/dist/zone-testing-bundle';

import { getTestBed } from '@angular/core/testing'; // tslint:disable-line
import {
  BrowserDynamicTestingModule,platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare const require: any;

// First,initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,platformBrowserDynamicTesting()
);

// Then we find all the tests.
const projectContext = require.context('./',true);
const sharedContext = require.context('../../../shared',true);

// And load the modules.
sharedContext.keys().map(sharedContext);
projectContext.keys().map(projectContext);

我的karma.conf.js

// Karma configuration file,see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '../../shared',frameworks: ['jasmine','@angular-devkit/build-angular'],plugins: [
      require('karma-jasmine'),require('karma-chrome-launcher'),require('karma-mocha-reporter'),require('karma-jasmine-html-reporter'),require('karma-coverage-istanbul-reporter'),require('@angular-devkit/build-angular/plugins/karma')
    ],client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },coverageIstanbulReporter: {
      dir: require('path').join(__dirname,'../coverage'),reports: ['html','lcovonly','text-summary'],fixWebpackSourcePaths: true
    },reporters: ['mocha'],mochaReporter: {
      ignoreSkipped: true
    },port: 9876,colors: true,logLevel: config.LOG_INFO,autoWatch: true,browsers: ['ChromeHeadless'],singleRun: false,});
};

我的tsconfig.spec.json(我试图修改路径,但没有帮助):

{
  "extends": "../../tsconfig.json","compilerOptions": {
    "baseUrl": "../../","rootDir": "../../","outDir": "../../out-tsc/spec","types": [
      "jasmine","node"
    ],"module": "esnext","inlinesources": true,"emitDecoratorMetadata": true,"experimentalDecorators": true,"resolveJsonmodule": true,"esModuleInterop": true,"importHelpers": true,"preserveSymlinks": true
  },"include": [
    "./src/**/*.ts","./src/**/*.spec.ts","../../shared/**/*.ts","../../shared/**/*.spec.ts"
  ],"exclude": []
}

有什么想法吗?

jinhuluntai 回答:无法正确测试Angular + Karma中不属于项目目录的文件

问题归结为在编译中两次包含shared文件。只需在projectContext.keys()中包含test.ts如下:

// This file is required by karma.conf.js and loads recursively all the .spec and framework files

import 'zone.js/dist/zone-testing-bundle';

import { getTestBed } from '@angular/core/testing'; // tslint:disable-line
import {
  BrowserDynamicTestingModule,platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare const require: any;

// First,initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,platformBrowserDynamicTesting()
);

// Then we find all the tests.
const projectContext = require.context('./',true);

// And load the modules.
projectContext.keys().map(projectContext);

之所以可行,是因为sharedlib目录内是符号链接的。借助Git实现,Symlink甚至可以在Unix / Windows之间移植。解决了!

总而言之:

  • 将符号链接添加到项目内部的shared目录中,而不是使用真实目录
  • 删除重复的require.context
  • 使用符号链接目录中的文件,而不要在项目外部使用两个路径
本文链接:https://www.f2er.com/3081000.html

大家都在问