Dela via


MSTEST0051: Assert.Throws ska bara innehålla en enda instruktion

Fastighet Värde
Regel-ID MSTEST0051
Titel Assert.Throws får bara innehålla en enda instruktion
Kategori Usage
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard Yes
Standard allvarlighetsgrad Information
Introducerad i version 3.11.0
Finns det en kodkorrigering Nej

Orsak

Ett anrop till Throws, ThrowsAsync, ThrowsExactlyeller ThrowsExactlyAsync innehåller flera instruktioner i åtgärdsdelegaten.

Regelbeskrivning

För att säkerställa att endast det specifika metodanrop som förväntas utlösa ett undantag testas, skickas åtgärdsdelegaten till Assert.Throws, Assert.ThrowsAsync, Assert.ThrowsExactlyeller Assert.ThrowsExactlyAsync ska innehålla exakt en instruktion. Att inkludera flera instruktioner kan leda till att tester skickas när undantaget utlöses av en instruktion som inte är avsedd att utlösas. Om det inte är den sista instruktionen i åtgärden som är avsedd att utlösas har testet död kod. Om det är den sista instruktionen bör avsikten anges tydligt.

Så här åtgärdar du överträdelser

Omstrukturera testet för att säkerställa att åtgärdsdelegaten endast innehåller ett uttryck som förväntas utlösa undantaget. Flytta all konfigurationskod utanför assertionsanropet.

Ändra till exempel följande:

[TestMethod]
public void TestMethod()
{
    var obj = new MyClass();
    Assert.ThrowsExactly<InvalidOperationException>(() =>
    {
        obj.Initialize();
        obj.Execute(); // Only this should be inside the assertion
    });
}

Så här gör du:

[TestMethod]
public void TestMethod()
{
    var obj = new MyClass();
    obj.Initialize();
    Assert.ThrowsExactly<InvalidOperationException>(() => obj.Execute());
}

När du ska ignorera varningar

Ignorera inte varningar från den här regeln. Att inkludera flera instruktioner i aktionsdelegaten kan göra det oklart vilken åtgärd som testas och kan leda till att tester går igenom när den ursprungliga avsikten bryts.