Ohjelmointi

Staattisten menetelmien testaaminen yksikössä C #

Rakentaessasi tai työskennellessäsi .NET-sovelluksissa saatat usein käyttää staattisia menetelmiä. C # -menetelmät voivat olla joko staattisia tai ei-staattisia. Ei-staattista menetelmää (joka tunnetaan myös nimellä instanssimenetelmänä) voidaan käyttää luokan luokassa, johon se kuuluu. Staattiset menetelmät eivät tarvitse kutsua luokan esiintymää - niitä voidaan kutsua itse luokassa.

Vaikka ei-staattisen menetelmän (ainakin sellaisen, joka ei kutsu staattista menetelmää tai ole vuorovaikutuksessa ulkoisten riippuvuuksien kanssa) testaaminen on suoraviivaista, staattisen menetelmän testaaminen ei ole ollenkaan helppoa. Tässä artikkelissa kerrotaan, kuinka voit voittaa tämän haasteen ja testata staattisia menetelmiä C #: ssä.

[Katso myös: Kuinka muokata Jumalan esineitä C #: ssä]

Jotta voit työskennellä tässä artikkelissa annettujen koodiesimerkkien kanssa, järjestelmässäsi on oltava asennettuna Visual Studio 2019. Jos sinulla ei vielä ole kopiota, voit ladata Visual Studio 2019 täältä.

Luo .NET Core -konsolisovellusprojekti Visual Studiossa

Luo ensin .NET Core Console -sovellusprojekti Visual Studiossa. Olettaen, että Visual Studio 2019 on asennettu järjestelmään, luo uusi .NET Core -konsolisovellusprojekti Visual Studiossa noudattamalla seuraavia ohjeita.

  1. Käynnistä Visual Studio IDE.
  2. Napsauta Luo uusi projekti.
  3. Valitse Luo uusi projekti -ikkunassa ”Console App (.NET Core)” näytetystä malliluettelosta.
  4. Napsauta Seuraava.
  5. Määritä seuraavan projektin nimi ja sijainti uuden Konfiguroi uusi projekti -ikkunassa.
  6. Napsauta Luo.

Tämä luo uuden .NET Core -konsolisovellusprojektin Visual Studio 2019: ssä. Luo samalla tavoin kaksi projektia - luokan kirjasto ja yksikkötesti (xUnit-testi). Käytämme näitä kolmea projektia kuvaamaan staattisten menetelmien yksikkötestausta tämän artikkelin seuraavissa osissa.

Kun staattista menetelmää voidaan ja ei voida testata yksiköllä

Staattisen menetelmän testaus ei ole eroa kuin yksikön testaus ei-staattisessa menetelmässä. Staattiset menetelmät eivät ole itsessään testattavia. Staattinen menetelmä, jolla ei ole tilaa tai joka ei muuta tilaa, voidaan testata yksiköllä. Niin kauan kuin menetelmä ja sen riippuvuudet ovat idempotentteja, menetelmä voidaan testata yksikköä. Ongelmat syntyvät, kun staattinen menetelmä kutsuu muita menetelmiä tai kun testattava kohde kutsuu staattista menetelmää. Toisaalta, jos testattava objekti kutsuu ilmentymämenetelmää, voit testata sen yksinkertaisella tavalla.

Staattista menetelmää ei voida testata yksikköä, jos jokin seuraavista pitää paikkansa:

  • Staattinen menetelmä on vuorovaikutuksessa ulkoisten riippuvuuksien, kuten tietokannan, tiedostojärjestelmän, verkon tai ulkoisen sovellusliittymän, kanssa.
  • Staattinen menetelmä pitää sisällään tilatietoja, ts. Jos se tallentaa välimuistin luokan staattiseksi objektiksi.

Harkitse seuraavaa koodinpätkää, joka näyttää kaksi luokkaa, nimittäin ProductBL ja Logger. Vaikka ProductBL on ei-staattinen luokka, Logger on staattinen luokka. Huomaa, että Logger-luokan Write-menetelmä on kutsuttu ProductBL-luokan LogMessage-menetelmästä.

julkisen luokan tuoteBL

    {

public void LogMessage (merkkijonoviesti)

        {

Logger.Write (viesti);

        }

    }

julkisen luokan kirjaaja

    {

public static void Write (merkkijono)

        {

// Kirjoita koodi tähän tietojen kirjaamiseksi

        }

    }

Oletetaan, että Logger-luokan Write-menetelmä muodostaa yhteyden tietokantaan ja kirjoittaa tiedot sitten tietokantataulukkoon. Tietokannan nimi ja taulukko, johon tiedot kirjoitetaan, saatetaan määrittää valmiiksi sovelluksessa appsettings.json. Kuinka voit nyt kirjoittaa yksikötestit ProductBL-menetelmälle?

Huomaa, että staattisia menetelmiä ei voida pilkata helposti. Esimerkiksi, jos sinulla on kaksi luokkaa nimeltä A ja B ja luokka A käyttää luokan B staattista jäsentä, et pystyisi testaamaan luokkaa A erikseen.

Kolme tapaa testata staattisia menetelmiä

Moq: n avulla voit pilkata ei-staattisia menetelmiä, mutta sitä ei voida käyttää staattisten menetelmien pilkkaamiseen. Vaikka staattisia menetelmiä ei voida pilkata helposti, staattisia menetelmiä voidaan pilkata muutamalla tavalla.

Voit hyödyntää Microsoftin Moles- tai Fakes-kehystä staattisten menetelmäpuheluiden pilkkaamiseksi. (Fakes-kehys sisällytettiin Visual Studio 2012: een Molesin seuraajana - se on seuraavan sukupolven Moles and Stubs.) Toinen tapa pilkata staattisia menetelmäkutsuja on käyttää edustajia. Staattisilla menetelmäkutsuilla on vielä toinen tapa pilkata sovelluksessa - käyttämällä käärintäluokkia ja riippuvuusinjektioita.

IMHO tämä viimeinen vaihtoehto on paras ratkaisu ongelmaan. Ainoa mitä sinun tarvitsee tehdä, on kietoa staattisen menetelmän kutsu ilmentymämenetelmän sisään ja sitten käyttää riippuvuusinjektiota injektoimalla käärintäluokan esiintymä testattavalle luokalle.

Luo kääreluokka C #

Seuraava koodinpätkä kuvaa LogWrapper-luokkaa, joka toteuttaa IWrapper-käyttöliittymän ja kutsuu kutsun Logger.Write () -menetelmään LogData-nimisen esiintymämenetelmän sisällä.

julkisen luokan LogWrapper: IWrapper

    {

merkkijono _viesti = tyhjä;

public LogWrapper (merkkijono)

        {

_viesti = viesti;

        }

public void LogData (merkkijono)

        {

_viesti = viesti;

Logger.Write (_viesti);

        }

    }

Seuraava koodinpätkä näyttää IWrapper-käyttöliittymän. Se sisältää LogData-menetelmän ilmoituksen.

julkinen käyttöliittymä IWrapper

    {

void LogData (merkkijonoviesti);

    }

ProductBL-luokka käyttää riippuvuusinjektiota (konstruktorinsyöttö) LogWrapper-luokan esiintymän injektoimiseksi alla olevan koodiluettelon mukaisesti.

julkisen luokan tuoteBL

    {

vain luku IWrapper _wrapper;

staattinen merkkijono _viesti = nolla;

julkinen ProductBL (IWrapper-kääre)

        {

_kääre = kääre;

        }

public void LogMessage (merkkijono)

        {

_viesti = viesti;

_wrapper.LogData (_viesti);

        }

    }

ProductBL-luokan LogMessage-menetelmä kutsuu LogData-menetelmän aiemmin injektoidussa LogWrapper-luokan ilmentymässä.

Luo yksikötestimenetelmä C #: ssä käyttämällä xUnit- ja Moq-yksiköitä

Avaa tiedosto UnitTest1.cs ja nimeä UnitTest1-luokka uudelleen UnitTestForStaticMethodsDemo-tiedostoksi. UnitTest1.cs-tiedostot nimetään automaattisesti uudeksi UnitTestForStaticMethodsDemo.cs-tiedostoksi. Hyödynnämme nyt Moq-kehystä mallien luomisessa, testaamisessa ja vahvistamisessa.

Seuraava koodinpätkä kuvaa, kuinka voit käyttää Moq-kehystä testimenetelmien yhdistämiseen C #: ssä.

var pilkata = uusi pilkata ();

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

uusi ProductBL (mock.Object) .LogMessage ("Hei maailma!");

pilkata.VerifyAll ();

Kun suoritat testin, tulosteen tulee näyttää Test Explorer -ikkunassa seuraavasti.

Testiluokan täydellinen koodiluettelo on annettu viitteenä.

julkinen luokka UnitTestForStaticMethodsDemo

    {

[Tosiasia]

public void StaticMethodTest ()

        {

var pilkata = uusi pilkata ();

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

uusi ProductBL (mock.Object) .LogMessage ("Hei maailma!");

pilkata.VerifyAll ();

        }

    }

Yksikkötestaus on prosessi, joka testaa koodin yksiköitä sovelluksessa tarkistaakseen, vastaavatko yksikötestin todelliset tulokset toivottuja tuloksia. Järkevästi käytettynä yksikkötestaus voi auttaa estämään virheitä projektin kehitysvaiheessa.

Staattiset menetelmät voivat aiheuttaa useita ongelmia, kun yrität testata niitä yksiköillä. Jos sovelluksesi vaatii pilkkaamaan staattista menetelmää, sinun on otettava huomioon, että suunnittelun haju - eli merkki huonosta suunnittelusta. Keskustelen pilkista, väärennöksistä ja tupakoinnista tarkemmin seuraavassa artikkelissa täällä.

Kuinka tehdä enemmän C #: ssä:

  • Kuinka refactor Jumalan esineitä C #
  • Kuinka käyttää ValueTaskia C #: ssä
  • Kuinka käyttää muuttumattomuutta C: ssä
  • Kuinka käyttää const, readonly ja staattinen C #: ssä
  • Tietomerkintöjen käyttäminen C #: ssä
  • Kuinka käyttää GUID-tunnuksia C # 8: ssa
  • Milloin abstraktia luokkaa vs. käyttöliittymää käytetään C #: ssä
  • Kuinka työskennellä AutoMapperin kanssa C #: ssä
  • Kuinka käyttää lambda-lausekkeita C #: ssä
  • Kuinka toimia Action-, Func- ja Predicate-edustajien kanssa C #: ssä
  • Kuinka työskennellä C #: n edustajien kanssa
  • Kuinka toteuttaa yksinkertainen kirjaaja C #: ssä
  • Kuinka työskennellä attribuuttien kanssa C #: ssä
  • Kuinka työskennellä log4netin kanssa C #: ssä
  • Kuinka toteuttaa arkiston suunnittelumalli C #: ssä
  • Kuinka työskennellä heijastuksen kanssa C #: ssä
  • Kuinka työskennellä tiedostojärjestelmän katselijan kanssa C #: ssä
  • Kuinka tehdä laiska alustus C #: ssä
  • Kuinka työskennellä MSMQ: n kanssa C #: ssä
  • Kuinka työskennellä laajennusmenetelmien kanssa C #: ssä
  • Kuinka meille lambda-lausekkeet C #: ssä
  • Milloin haihtuvaa avainsanaa käytetään C #: ssä
  • Tuottoavainsanan käyttäminen C #: ssä
  • Kuinka toteuttaa polymorfismi C #: ssa
  • Kuinka rakentaa oma tehtävän ajastin C #
  • Kuinka työskennellä RabbitMQ: n kanssa C #: ssä
  • Kuinka työskennellä C #: n kanssa
  • Virtuaalisten ja abstraktien menetelmien tutkiminen C #: ssä
  • Kuinka käyttää Dapper ORMia C #: ssä
  • Lentopainokuvion käyttäminen C #: ssä
$config[zx-auto] not found$config[zx-overlay] not found