Programování

Jak testovat statické metody v C #

Při vytváření nebo práci v aplikacích .NET můžete často používat statické metody. Metody v C # mohou být statické nebo nestatické. Nestatickou metodu (známou také jako metoda instance) lze vyvolat na instanci třídy, do které patří. Statické metody nevyžadují vyvolání instance třídy - lze je vyvolat v samotné třídě.

Ačkoli je testování nestatické metody (alespoň takové, která nevolá statickou metodu nebo interaguje s externími závislostmi) jednoduché, testování statické metody není vůbec snadný úkol. Tento článek hovoří o tom, jak můžete tuto výzvu překonat a otestovat statické metody v C #.

[Také na: Jak refaktorovat Boží objekty v C #]

Chcete-li pracovat s příklady kódu uvedenými v tomto článku, měli byste mít ve svém systému nainstalovanou Visual Studio 2019. Pokud ještě nemáte kopii, můžete si stáhnout Visual Studio 2019 zde.

Vytvořte projekt aplikace konzoly .NET Core v sadě Visual Studio

Nejprve si vytvořme projekt konzolové aplikace .NET Core v sadě Visual Studio. Za předpokladu, že je ve vašem systému nainstalovaná sada Visual Studio 2019, postupujte podle níže uvedených kroků a vytvořte nový projekt konzolové aplikace .NET Core v sadě Visual Studio.

  1. Spusťte Visual Studio IDE.
  2. Klikněte na „Vytvořit nový projekt“.
  3. V okně „Vytvořit nový projekt“ vyberte ze zobrazeného seznamu šablon „Console App (.NET Core)“.
  4. Klikněte na Další.
  5. V dalším okně „Konfigurace nového projektu“ zadejte název a umístění nového projektu.
  6. Klikněte na Vytvořit.

Tím se vytvoří nový projekt aplikace konzoly .NET Core v sadě Visual Studio 2019. Podobným způsobem vytvořte další dva projekty - knihovnu tříd a projekt testu jednotky (test xUnit). Tyto tři projekty použijeme k ilustraci jednotkového testování statických metod v následujících částech tohoto článku.

Když statická metoda může a nemůže být testována na jednotku

Jednotkové testování statické metody se neliší od testování jednotky nestatické metody. Statické metody nejsou samy o sobě neprověřitelné. Statickou metodu, která neobsahuje žádný stav nebo stav nezmění, lze otestovat jednotkou. Pokud je metoda a její závislosti idempotentní, lze metodu testovat na jednotku. Problémy nastávají, když statická metoda volá jiné metody nebo když testovaný objekt volá statickou metodu. Na druhou stranu, pokud testovaný objekt volá instanční metodu, můžete ji snadno otestovat jednotkou.

Statickou metodu nelze testovat na jednotku, pokud platí některá z následujících možností:

  • Statická metoda interaguje s externími závislostmi, jako je databáze, systém souborů, síť nebo externí API.
  • Statická metoda obsahuje informace o stavu, tj. Pokud ukládá data do statického objektu třídy.

Zvažte následující fragment kódu, který zobrazuje dvě třídy, jmenovitě ProductBL a Logger. Zatímco ProductBL je nestatická třída, Logger je statická třída. Všimněte si, že metoda Write třídy Logger byla volána z metody LogMessage třídy ProductBL.

veřejná třída ProductBL

    {

public void LogMessage (řetězcová zpráva)

        {

Logger.Write (zpráva);

        }

    }

veřejná třída Logger

    {

public static void Write (textová zpráva)

        {

// Sem napište kód pro přihlášení dat

        }

    }

Předpokládejme, že metoda Write třídy Logger se připojí k databázi a poté zapíše data do databázové tabulky. Název databáze a její tabulky, kam by se měla data zapisovat, může být předem nakonfigurován v souboru appsettings.json. Jak nyní můžete psát jednotkové testy pro metodu ProductBL?

Všimněte si, že statické metody nelze snadno zesměšňovat. Jako příklad, pokud máte dvě třídy pojmenované A a B a třída A používá statický člen třídy B, nebudete moci testovat jednotku třídy A izolovaně.

Tři způsoby, jak testovat statické metody

Můžete použít Moq k zesměšňování nestatických metod, ale nelze jej použít k zesměšňování statických metod. Ačkoli statické metody nelze snadno zesměšňovat, existuje několik způsobů, jak zesměšňovat statické metody.

Můžete využít výhod rámce Moles or Fakes od Microsoftu k falešným voláním statické metody. (The Fakes framework was included in Visual Studio 2012 as the nástupce Moles - it is the next generation of Moles and Stubs.) Dalším způsobem, jak zesměšňovat volání statické metody, je použití delegátů. Existuje ještě další způsob, jak zesměšňovat volání statické metody v aplikaci - pomocí tříd obálky a vkládání závislostí.

IMHO tato poslední možnost je nejlepším řešením problému. Vše, co musíte udělat, je zabalit volání statické metody uvnitř metody instance a poté pomocí injekce závislostí vložit instanci třídy wrapper do testované třídy.

Vytvořte obálkovou třídu v C #

Následující fragment kódu ilustruje třídu LogWrapper, která implementuje rozhraní IWrapper, a zalomí volání metody Logger.Write () uvnitř metody instance s názvem LogData.

veřejná třída LogWrapper: IWrapper

    {

string _message = null;

veřejný LogWrapper (řetězcová zpráva)

        {

_message = zpráva;

        }

public void LogData (textová zpráva)

        {

_message = zpráva;

Logger.Write (_message);

        }

    }

Následující fragment kódu ukazuje rozhraní IWrapper. Obsahuje deklaraci metody LogData.

veřejné rozhraní IWrapper

    {

void LogData (textová zpráva);

    }

Třída ProductBL používá injekci závislostí (injektor konstruktoru) k vložení instance třídy LogWrapper, jak je uvedeno v níže uvedeném seznamu kódů.

veřejná třída ProductBL

    {

pouze pro čtení IWrapper _wrapper;

statický řetězec _message = null;

public ProductBL (obal IWrapper)

        {

_wrapper = wrapper;

        }

public void LogMessage (řetězcová zpráva)

        {

_message = zpráva;

_wrapper.LogData (_message);

        }

    }

Metoda LogMessage třídy ProductBL volá metodu LogData na instanci třídy LogWrapper třídy, která byla vložena dříve.

Použijte xUnit a Moq k vytvoření metody testování jednotky v C #

Otevřete soubor UnitTest1.cs a přejmenujte třídu UnitTest1 na UnitTestForStaticMethodsDemo. Soubory UnitTest1.cs by se automaticky přejmenovaly na UnitTestForStaticMethodsDemo.cs. Nyní využijeme rámec Moq k nastavení, testování a ověřování falešných zpráv.

Následující fragment kódu ukazuje, jak můžete použít rozhraní Moq k jednotkovým testovacím metodám v C #.

var mock = new Mock ();

mock.Setup (x => x.LogData (It.IsAny ()));

new ProductBL (mock.Object) .LogMessage ("Hello World!");

mock.VerifyAll ();

Po provedení testu by měl výstup vypadat v okně Průzkumníka testů.

Níže je uveden kompletní seznam kódů testovací třídy.

veřejná třída UnitTestForStaticMethodsDemo

    {

[Skutečnost]

public void StaticMethodTest ()

        {

var mock = new Mock ();

mock.Setup (x => x.LogData (It.IsAny ()));

new ProductBL (mock.Object) .LogMessage ("Hello World!");

mock.VerifyAll ();

        }

    }

Testování jednotek je proces, který testuje jednotky kódu v aplikaci, aby se zkontrolovalo, zda skutečné výsledky vašeho testu jednotky odpovídají požadovaným výsledkům. Pokud bude použito uvážlivě, může testování jednotek pomoci zabránit chybám ve fázi vývoje projektu.

Statické metody mohou představovat řadu problémů, když se je pokusíte testovat pomocí falešných jednotek. Pokud vaše aplikace vyžaduje, abyste zesměšnili statickou metodu, měli byste vzít v úvahu, že vůně designu - tj. Indikátor špatného designu. V dalším článku zde budu podrobněji diskutovat o falešných, falešných a pahýlech.

Jak udělat více v C #:

  • Jak refaktorovat Boží objekty v C #
  • Jak používat ValueTask v C #
  • Jak používat neměnnost v C.
  • Jak používat const, readonly a static v C #
  • Jak používat datové anotace v C #
  • Jak pracovat s identifikátory GUID v C # 8
  • Kdy použít abstraktní třídu vs. rozhraní v C #
  • Jak pracovat s AutoMapperem v C #
  • Jak používat výrazy lambda v C #
  • Jak pracovat s delegáty Action, Func a Predicate v C #
  • Jak pracovat s delegáty v C #
  • Jak implementovat jednoduchý záznamník v C #
  • Jak pracovat s atributy v C #
  • Jak pracovat s log4net v C #
  • Jak implementovat vzor návrhu úložiště v C #
  • Jak pracovat s odrazem v C #
  • Jak pracovat se souborovým systémem v C #
  • Jak provést línou inicializaci v C #
  • Jak pracovat s MSMQ v C #
  • Jak pracovat s metodami rozšíření v C #
  • Jak na nás lambda výrazy v C #
  • Kdy použít volatilní klíčové slovo v C #
  • Jak používat klíčové slovo výnos v C #
  • Jak implementovat polymorfismus v C #
  • Jak vytvořit svůj vlastní plánovač úloh v C #
  • Jak pracovat s RabbitMQ v C #
  • Jak pracovat s n-ticí v C #
  • Zkoumání virtuálních a abstraktních metod v C #
  • Jak používat Dapper ORM v C #
  • Jak používat návrhový vzor muší váhy v C #