CA1822在发布模式下错误地应用于[TestMethod]异步任务方法?

时间:2016-07-28 22:55:08

标签: c# asynchronous async-await mstest code-analysis

我正在使用自定义规则集,该规则集已将CA1822设置为错误。

我有一个TestMethod,即异步,所以它返回一个Task。此方法不使用任何字段,因此代码Analysis标记规则CA1822,将其标记为静态。 但是MSTest无法调用静态异步任务方法(未在测试资源管理器中列出)。 因此,它似乎是代码分析逻辑中的一个缺陷。我是C#的新手,所以我尽力遵循代码分析,在我觉得我应该违反规则的时候进行压制。但这是我第一次发现自己认为这条规则是错误的。

[TestMethod]
public async Task TestMethod1()
{
    await Task.Delay(10);
}



Severity    Code    Description Project File    Line    Suppression State
Error   CA1822  The 'this' parameter (or 'Me' in Visual Basic) of 'UnitTest1.TestMethod1()' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate.   

我错过了规则吗?或者这只是一个角落 没有经过测试的情况?

尝试更多条件,在发布模式下似乎只是一个问题。在调试模式下,它永远不会标记CA1822。 如果我的testMethod不是异步,那么规则永远不会在调试或发布模式下应用。

所以我想我应该提到这是在2015年企业版RC3中。

对我而言,这表明它是RuleSet中的一个极端案例,但我想听听其他人的想法。

1 个答案:

答案 0 :(得分:0)

规则来自性能集,从性能角度来看,将规则设置为静态会更快。可能有1000个原因,在这种情况下它是其中之一的单元测试方法,可能会导致您不应用此规则。

对于大多数项目,我个人都关闭了此规则。在许多情况下,它会导致糟糕的面向对象设计,即使它执行得更快。来自文档的小话:

  

在某些情况下,无法访问当前对象实例表示正确性问题。

这通常是更正确的评论,但在这种情况下不适用。