Visual Studio 2019存在单元测试但代码覆盖率结果显示未覆盖问题
问题原因拆解
SpliceController.<>c是C#编译器为Lambda、异步方法、迭代器等语法糖自动生成的闭包类,属于编译器生成的内部代码,同一个方法多次列出是不同执行分支生成的对应闭包代码。- 覆盖率为0%、
[ExcludeFromCodeCoverage]特性不生效核心是你的.runsettings配置缺失必要规则,同时可能存在操作、环境适配问题。
解决步骤
- 补全.runsettings配置规则
你当前的配置没有声明识别[ExcludeFromCodeCoverage]特性,也没有排除编译器生成的闭包类,在<CodeCoverage>节点下新增以下配置:
<!-- 识别ExcludeFromCodeCoverage特性,排除对应代码 --> <Attributes> <Exclude> <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute> </Exclude> </Attributes>
同时在<Functions><Exclude>节点下新增规则,排除编译器生成的闭包类:
<Function>.*<>c.*</Function>
如果你的Controller方法多为异步方法,可以额外加规则排除异步生成的状态机代码:
<Function>.*IAsyncStateMachine.*</Function>
- 确认操作与环境配置
- 确保VS2019版本升级到16.8及以上,该版本才完整支持.NET 5的代码覆盖率收集。
- 单元测试项目需显式安装
Microsoft.CodeCoverageNuGet包,版本匹配你的.NET 5 runtime。 - 主API项目的生成配置中,调试信息设置为「可移植」或「完整」(右键项目>属性>生成>高级>调试信息)。
- 执行测试时选择「测试」菜单下的「分析所有测试的代码覆盖率」,而非普通的运行测试,普通运行不会收集覆盖率数据。
- 确认你已经在VS中指定了自定义runsettings:测试>配置运行设置>选择解决方案中的
codecoverage.runsettings文件。
- 排查极端情况
如果以上操作后覆盖率还是为0,检查你的单元测试代码是否真的触发了Controller的实际执行逻辑:
- 确认Moq模拟的依赖没有被设置为跳过实际方法调用,不要随意使用
mock.CallBase = false的配置。 - 检查测试方法有没有加
[TestMethod]特性,测试执行时没有被过滤跳过。
内容的提问来源于stack exchange,提问作者Cade Bryant
相关产品推荐
相关产品推荐

