我已经设置了一个带有Angular 应用程序和两个库的NX monorepo:mylib-amylib-b.每个库都有一个组件(mylib-a中的TitleWidgetmylib-b中的TitleWidgetB).这些组件中的每一个都有自己的一套Cypress组件测试.我可以分别 for each 库运行测试,但我正在努力找出如何检测我的源代码,并进一步获得两个组件的组合测试覆盖报告.

您可以在此处找到示例应用程序和如何运行它的说明:https://github.com/rtm-celum/angular-cypress-component-test-coverage

我遵循了Cypress E2E代码覆盖率指南(https://docs.cypress.io/guides/tooling/code-coverage#E2E-and-unit-code-coverage),并设法安装了插件和它周围的一切.

我还try 遵循https://nx.dev/packages/angular/generators/cypress-component-configuration并添加指令插入设置(babel-loader,babel-plugin-istanbul),作为webpack通过cypress.config.ts或通过我的应用程序project.json文件中的目标进行的其他配置.

无论我try 什么,当我执行 cypress 组件测试时,.nyc_output/out.json总是空的{}.

推荐答案

我在设置上也遇到了问题,但最终我找到了解决方案.

以下是必需的步骤:

  1. 安装更多依赖项:
    npm i @cypress/code-coverage @jsdevtools/coverage-istanbul-loader -D
    
  2. 向课程项目添加自定义webpack配置
    import * as path from "path";
    
    export const CoverageWebpack = {
        module: {
            rules: [
                {
                    test: /\.(js|ts)$/,
                    loader: '@jsdevtools/coverage-istanbul-loader',
                    options: {esModules: true},
                    enforce: 'post',
                    include: [
                        path.join(__dirname, '../..', 'apps'),
                        path.join(__dirname, '../..', 'libs')
                    ],
                    exclude: [
                        /\.(cy|spec)\.ts$/,
                        /node_modules/
                    ]
                }
            ]
        }
    };
    
  3. 按如下方式修改cypress.config.ts:
     import {nxComponentTestingPreset} from '@nx/angular/plugins/component-testing';
     import {defineConfig} from 'cypress';
     import {CoverageWebpack} from './coverage.webpack'
    
     const nxPreset = nxComponentTestingPreset(__filename);
    
     export default defineConfig({
       component: {
         ...nxPreset,
       devServer: {
         ...nxPreset.devServer,
         webpackConfig: CoverageWebpack,
       },
       setupNodeEvents(on, config) {
       // eslint-disable-next-line @typescript-eslint/no-var-requires
       require('@cypress/code-coverage/task')(on, config)
       // include any other plugin code...
    
           // It's IMPORTANT to return the config object
           // with any changed environment variables
           return config;
         },
       }
     });
    
  4. 将以下行添加到Component.ts(thx@Miguel)
    import '@cypress/code-coverage/support'
    

以下是我对mylib-a的结果: coverage output html

不幸的是, cypress 的命令也将被列出.也许可以通过更改overage.webpack.ts中的包含或排除来解决此问题.

我希望我没有忘记任何东西.(我克隆了您的项目并对其进行了修改.如果您为我创建一个分支,如果您愿意,我可能会将我的更改推入其中.)

Angular相关问答推荐

如何跨不同组件使用ng模板

MAT表的内联文本编辑-未刷新编辑图标

Change上的Angular 自定义控件无法正常工作

Angular 16+使用ngTemplateOutlet有条件地呈现几个模板中的一个

无法在Mat-SideNav中绑定模式

如何将 Firebase 云消息传递 (FCM) 与 Angular 15 结合使用?

如何处理后端删除元素后元素列表的刷新

完成行为主体

Angular 14 类型表单 - 数字控件的初始值

在父组件的子组件中使用 ng-template

Angular 2 中的 ChangeDetectionStrategy.OnPush 和 Observable.subscribe

无法读取 angular2 中未定义(…)的属性 push

如何使用Angular4通过元素ID设置焦点

如何在 bootstrap Angular 2 应用程序时调用休息 api

如何使用 Bootstrap 4 flexbox 填充可用内容?

如何为 Angular 2 中的渲染元素绑定事件监听器?

Failed to execute 'setAttribute' on 'Element': ']' is not a valid attribute name

Angular 2表单验证重复密码

No provider for Router?

为什么 ngOnInit 被调用两次?