2016-07-28 33 views
2

Ich arbeite mit einem benutzerdefinierten RuleSet, in dem CA1822 als Fehler aktiviert ist.CA1822 wird fälschlicherweise auf [TestMethod] asynchrone Aufgabenmethoden im Freigabemodus angewendet?

Ich habe eine Testmethode, das ist async, also gibt es eine Aufgabe zurück. Diese Methode verwendet keine Felder, daher markiert die Codeanalyse-Regel CA1822 sie als statisch. MSTest kann jedoch keine statische asynchrone Task-Methode aufrufen (nicht im Test Explorer aufgeführt). Es scheint also ein Fehler in der Logik für die Code-Analyse. Ich bin ziemlich neu in C#, also versuche ich, Code-Analyse so gut wie möglich zu verfolgen und setze Unterdrückung ein, wenn ich das Gefühl habe, dass ich die Regeln brechen sollte. Aber das ist das erste Mal, dass ich denke, dass die Regel einfach falsch ist.

[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. 

Fehle ich etwas mit der Regel? Oder ist das gerade genug von einer Ecke Fall, dass es nicht getestet wurde?

Probieren Sie einige weitere Bedingungen, scheint es nur ein Problem im Freigabemodus. Im Debug-Modus wird CA1822 nicht markiert. Wenn meine testMethod nicht asynchron ist, wird die Regel im Debug- oder Release-Modus nicht angewendet.

Also ich denke, ich sollte erwähnen, das ist in Studio 2015 Enterprise RC3.

Das bedeutet für mich, dass es ein Eckfall im RuleSet ist, aber ich würde gerne hören, was andere Leute denken.

+1

Debuggen und Freigeben generieren etwas anderen Code. Wenn Sie wirklich interessiert sind - sehen Sie sich IL von Release-Code an und sehen Sie, wie die Methode für 'async' geschrieben wird - wahrscheinlich werden Sie feststellen, dass in Release keine Verwendung von' this' vorliegt. (Wäre etwas interessantes zu liefern als Information) –

+0

Ich glaube, Sie sind auf etwas, aber ich verstehe nicht genug davon, um es zu bekommen. Mit Blick auf die Diffs für die Debug- und Release-IL erweitert das Debug-Objekt das Objekt, während das Release ValueType erweitert. Genauer gesagt befindet sich mein [TestMethod] im Debug-Modus in der Klasse UnitTestProject4.UnitTest1, aber im Freigabemodus ist es ein Werttyp UnitTestProject4.UnitTest1. Ich verstehe die Implikationen nicht wirklich, aber ich denke, Sie haben Recht, dass dies der Hauptunterschied ist. –

Antwort

0

Die Regel stammt aus der Leistungsgruppe, und aus Leistungsperspektive wäre es schneller, die Regel statisch zu machen. Es kann eine 1000 Gründe geben, da es sich bei einer Unit-Test-Methode in diesem Fall um eine davon handelt, die dazu führen kann, dass Sie diese Regel nicht anwenden.

Ich habe diese Regel für die meisten Projekte persönlich deaktiviert. In vielen Fällen führt dies zu einem schlechten objektorientierten Design, selbst wenn es etwas schneller ausgeführt wird. Die kleine Bemerkung aus der Dokumentation:

In einigen Fällen stellt der Fehler beim Zugriff auf die aktuelle Objektinstanz ein Korrektheitsproblem dar.

Das ist im Allgemeinen eine korrektere Bemerkung, obwohl es in diesem Fall nicht gilt.