整个命名空间的“SuppressMessage”

问题描述 投票:0回答:5

我在测试方法中使用下划线以获得更好的可读性,并且我想抑制整个测试命名空间的 FxCop 错误/警告。

我怎样才能实现这个目标?我玩了

GlobalSuppressions.cs
但没有任何效果:

[module: System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores",
    Scope = "namespace", Target = "Company.Product.Tests")]

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores",
    Scope = "namespace", Target = "Company.Product.Tests")]
c# .net namespaces code-analysis fxcop
5个回答
133
投票

自 Visual Studio 2019 起,可以抑制命名空间及其所有后代符号的代码分析警告:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores",
    Justification = "Test methods require underscores for readability."
    Scope = "namespaceanddescendants", Target = "~NCompany.Product.Tests")]

Scope - 正在抑制警告的目标。如果未指定目标,则将其设置为属性的目标。支持的范围包括以下内容:

  • ...

  • namespaceanddescendants
    -(Visual Studio 2019 的新增功能)此范围会抑制命名空间及其所有后代符号中的警告。
    namespaceanddescendants
    值仅对 Roslyn 分析器有效,并且会被基于 FxCop 的二进制静态分析忽略。

抑制代码分析警告#SuppressMessage 属性@ MS Docs

~N
属性的
Target
部分是推荐的目标格式(性能优化)


44
投票

您可以为此使用“模块”作用域,较旧的编译器比支持较新的“命名空间和后代”作用域的编译器支持该作用域。模块范围影响项目中的所有内容,并且不需要目标规范。

用法示例:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores",
    Justification = "Test methods require underscores for readability."
    Scope = "module")]

7
投票

我已经成功地通过使用包含以下规则的 .editorconfig 文件忽略了专门针对测试项目的特定警告(我遵循命名约定,其中这些项目始终以“Tests.cs”结尾):

[*Tests.cs] dotnet_diagnostics.CA1707.severity = none

有关我的答案的更多信息

这里


2
投票
是的,FxCop 不可能做到这一点

<= 10.0.

您可以做的是使用自定义规则文件禁用 CA1707(也许仅适用于您的测试项目)。


2
投票
正如已经说过的,它不可能开箱即用。恕我直言,这是有意的,因为抑制必须统一完成。

有一种解决方法可以通过

FXCop 10

 使用 
Copy As > Module-level SuppressMessage
 功能手动执行此操作。

缺点,每次修改命名空间时都必须重复此操作,但正如已经说过的,应该隔离全局抑制。

    在 FXCop 10 中打开程序集(此处为
  1. System.Xml)并运行分析
  2. 选择您的命名空间(
  3. System.Xml此处)
  4. 选择所有违反的规则
  5. 右键单击并
  6. Copy As > Module-level SupressMessage
     
  7. 然后将其粘贴到
  8. GlobalSuppressions.cs
    例如

注意:这可以在程序集、命名空间或类型级别完成。

Module-level SuppressMessage

© www.soinside.com 2019 - 2024. All rights reserved.