2016-07-28 44 views
2

我正在使用自定義RuleSet,其中一個CA1822作爲錯誤打開。CA1822錯誤地應用於發佈模式中的[TestMethod]異步任務方法?

我有一個TestMethod,它是異步的,所以它返回一個Task。此方法不使用任何字段,因此代碼分析標誌規則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不是異步的,那麼該規則將永遠不適用於調試或發佈模式。

所以我想我應該提到這是在studio 2015企業RC3。

對我而言,這表明它是RuleSet中的一個角落案例,但我想聽聽其他人的想法。

+1

調試和發佈生成稍有不同的代碼。如果你真的感興趣 - 查看IL的發佈代碼,看看如何重寫'async'方法 - 很可能你會發現在發佈時沒有使用'this'。 (會提供一些有趣的信息作爲自我回答) –

+0

我認爲你對某事有所瞭解,但我對此並不瞭解。查看調試和發佈IL的差異,調試擴展對象,而該版本擴展了ValueType。更具體地說,在調試中,我的[TestMethod]位於:class UnitTestProject4.UnitTest1中,但在發佈模式下,它的值類型爲UnitTestProject4.UnitTest1。我不太瞭解其中的含義,但我認爲你是對的,這是關鍵的區別。 –

回答

0

該規則來自性能集,並且從性能角度來看,使規則靜態化會更快。可能有1000個原因,在這種情況下是單元測試方法之一,可能會導致您不適用此規則。

我個人已經關閉了大多數項目的規則。在很多情況下,它會導致糟糕的面向對象設計,即使它執行速度稍快。來自文檔的小評論:

在某些情況下,訪問當前對象實例失敗表示正確性問題。

這通常是一個更正確的評論,儘管它不適用於這種情況。