Programavimas

Kaip susieti statinius metodus C #

Kurdami ar dirbdami .NET programose dažnai galite naudoti statinius metodus. C # metodai gali būti statiniai arba nestatiški. Nestatinis metodas (taip pat žinomas kaip egzempliorių metodas) gali būti naudojamas klasės, kuriai jis priklauso, egzemplioriuje. Statiniams metodams iškviesti nereikia klasės egzemplioriaus - juos galima iškviesti pačioje klasėje.

Nors nestatinio metodo (bent jau tokio, kuris nevadina statinio metodo ar sąveikauja su išorinėmis priklausomybėmis) testavimas yra paprastas, statinio metodo bandymas iš viso nėra lengva užduotis. Šiame straipsnyje kalbama apie tai, kaip galite įveikti šį iššūkį ir išbandyti statinius metodus C #.

[Taip pat apie tai, kaip modifikuoti Dievo objektus C #]

Norėdami dirbti su šiame straipsnyje pateiktais kodų pavyzdžiais, sistemoje turite būti įdiegę „Visual Studio 2019“. Jei dar neturite kopijos, galite atsisiųsti „Visual Studio 2019“ čia.

„Visual Studio“ sukurkite .NET Core konsolės programos projektą

Pirmiausia sukurkime .NET Core Console Application projektą „Visual Studio“. Darant prielaidą, kad „Visual Studio 2019“ yra įdiegta jūsų sistemoje, atlikite toliau nurodytus veiksmus, kad sukurtumėte naują .NET Core konsolės programos projektą „Visual Studio“.

  1. Paleiskite „Visual Studio IDE“.
  2. Spustelėkite „Sukurti naują projektą“.
  3. Lange „Kurti naują projektą“ iš rodomų šablonų sąrašo pasirinkite „Console App (.NET Core)“.
  4. Spustelėkite Pirmyn.
  5. Tada rodomame lange „Konfigūruoti naują projektą“ nurodykite naujo projekto pavadinimą ir vietą.
  6. Spustelėkite Sukurti.

Tai sukurs naują „.NET Core“ konsolės programos projektą „Visual Studio 2019“. Panašiai sukurkite dar du projektus - klasės bibliotekos ir vieneto testo („xUnit test“) projektą. Šiuos tris projektus naudosime iliustruodami statinių metodų bandymą tolesniuose šio straipsnio skyriuose.

Kai statinį metodą galima ir negalima išbandyti vienetu

Statinio metodo bandymas nesiskiria nuo nestatinio metodo. Statiniai metodai savaime nėra išbandomi. Statinis metodas, neturintis būsenos arba nekeičiantis būsenos, gali būti išbandytas vienetu. Kol metodas ir jo priklausomybės yra idempotentiniai, metodą galima išbandyti atskirai. Problemos kyla, kai statinis metodas iškviečia kitus metodus arba kai bandomas objektas iškviečia statinį metodą. Kita vertus, jei bandomas objektas iškviečia egzempliorių metodą, galite lengvai jį išbandyti.

Statinio metodo negalima išbandyti vienetu, jei tinka bet kuris iš šių dalykų:

  • Statinis metodas sąveikauja su išorinėmis priklausomybėmis, tokiomis kaip duomenų bazė, failų sistema, tinklas ar išorinė API.
  • Statinis metodas turi būsenos informaciją, t.y., jei jis talpina duomenis į statinį klasės objektą.

Apsvarstykite šį kodo fragmentą, kuriame rodomos dvi klasės, būtent „ProductBL“ ir „Logger“. Nors „ProductBL“ yra ne statinė klasė, „Logger“ yra statinė klasė. Atkreipkite dėmesį, kad „Logger“ klasės „Write“ metodas buvo iškviestas iš „ProductBL“ klasės „LogMessage“ metodo.

viešoji klasė „ProductBL“

    {

public void „LogMessage“ (eilutės pranešimas)

        {

Logger.Write (pranešimas);

        }

    }

viešosios klasės „Logger“

    {

public static void Write (eilutės pranešimas)

        {

// Norėdami užregistruoti duomenis, čia parašykite savo kodą

        }

    }

Tarkime, kad „Logger“ klasės „Write“ metodas prisijungia prie duomenų bazės ir tada įrašo duomenis į duomenų bazės lentelę. Duomenų bazės pavadinimas ir lentelė, kurioje turėtų būti įrašomi duomenys, gali būti iš anksto sukonfigūruoti faile appsettings.json. Kaip dabar galite parašyti „ProductBL“ metodo vieneto testus?

Atkreipkite dėmesį, kad statinių metodų negalima lengvai tyčiotis. Pavyzdžiui, jei turite dvi klases, pavadintas A ir B, o A klasėje naudojamas statinis B klasės narys, negalėtumėte A klasės bandymų atlikti atskirai.

Trys būdai, kaip išbandyti statinius metodus

Galite naudoti „Moq“, norėdami tyčiotis iš ne statinių metodų, tačiau jo negalima naudoti, kad tyčiotis iš statinių metodų. Nors iš statinių metodų negalima lengvai tyčiotis, yra keletas būdų, kaip tyčiotis iš statinių metodų.

Norėdami pasinaudoti statinio metodo skambučiais, galite pasinaudoti „Microsoft“ sukurta „Moles“ arba „Fakes“ sistema. („Fakes“ sistema buvo įtraukta į „Visual Studio 2012“ kaip „Moles“ įpėdinė - tai naujos kartos „Moles“ ir „Stubs“.) Kitas būdas pasityčioti iš statinio metodo skambučių yra delegatų naudojimas. Yra dar vienas būdas pajuokauti statinio metodo skambučius programoje - naudojant įvyniojimo klases ir priklausomybės injekcijas.

IMHO ši paskutinė galimybė yra geriausias problemos sprendimas. Viskas, ką jums reikia padaryti, tai apvynioti statinio metodo iškvietimą į egzemplioriaus metodą ir tada naudoti priklausomybės injekciją, kad įvestų paketo klasės egzempliorių būtų įpurškiama į bandomą klasę.

Sukurkite įvyniojimo klasę C #

Šis kodo fragmentas iliustruoja „LogWrapper“ klasę, įgyvendinančią „IWrapper“ sąsają ir įtraukiantį iškvietimą į „Logger.Write (“) metodą egzemplioriaus metodo, pavadinto „LogData“, viduje.

viešoji klasė „LogWrapper“: „IWrapper“

    {

eilutė _ žinutė = nulinė;

public LogWrapper (eilutės pranešimas)

        {

_ žinutė = pranešimas;

        }

public void „LogData“ (eilutės pranešimas)

        {

_ žinutė = pranešimas;

Logger.Write (_ žinutė);

        }

    }

Šis kodo fragmentas rodo „IWrapper“ sąsają. Jame pateikiama „LogData“ metodo deklaracija.

viešoji sąsaja „IWrapper“

    {

negaliojantis „LogData“ (eilutės pranešimas);

    }

„ProductBL“ klasė naudoja priklausomybės įpurškimą (konstruktoriaus įpurškimą), kad būtų galima švirkšti „LogWrapper“ klasės egzempliorių, kaip parodyta toliau pateiktame kodų sąraše.

viešoji klasė „ProductBL“

    {

tik skaitomas „IWrapper _wrapper“;

statinė eilutė _message = null;

viešasis „ProductBL“ („IWrapper“ įvyniojimas)

        {

_wrapper = pakuotė;

        }

public void „LogMessage“ (eilutės pranešimas)

        {

_ žinutė = pranešimas;

_wrapper.LogData (_ žinutė);

        }

    }

„ProductBL“ klasės „LogMessage“ metodas iškviečia „LogData“ metodą anksčiau „LogWrapper“ klasės egzemplioriuje.

Norėdami sukurti vieneto bandymo metodą C #, naudokite „xUnit“ ir „Moq“.

Atidarykite failą „UnitTest1.cs“ ir pervardykite „UnitTest1“ klasę į „UnitTestForStaticMethodsDemo“. Failai „UnitTest1.cs“ būtų automatiškai pervadinti į „UnitTestForStaticMethodsDemo.cs“. Dabar mes pasinaudosime „Moq“ sistemos pranašumais, norėdami nustatyti, išbandyti ir patikrinti pašaipas.

Šis kodo fragmentas parodo, kaip galite naudoti „Moq“ sistemą bandymų metodams kaupti C #.

var pasityčioti = naujas pasityčiojimas ();

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

naujas „ProductBL“ („mock.Object“) .LogMessage („Sveikas pasaulis!“);

tyčiotis.VerifyAll ();

Kai atliksite testą, štai kaip išvestis turėtų atrodyti „Test Explorer“ lange.

Pilnas bandymų klasės kodų sąrašas pateikiamas toliau.

viešoji klasė „UnitTestForStaticMethodsDemo“

    {

[Faktas]

public void „StaticMethodTest“ ()

        {

var pasityčioti = naujas pasityčiojimas ();

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

naujas „ProductBL“ („mock.Object“) .LogMessage („Sveikas pasaulis!“);

tyčiotis.VerifyAll ();

        }

    }

Vieneto testavimas yra procesas, kurio metu programoje tikrinami kodo vienetai, siekiant patikrinti, ar tikrieji jūsų vieneto bandymo rezultatai atitinka norimus rezultatus. Protingai naudojamas vienetinis testavimas gali padėti išvengti klaidų projekto kūrimo etape.

Statiniai metodai gali sukelti daug problemų, kai bandote juos išbandyti naudodami maketus. Jei jūsų programa reikalauja, kad tyčiotės iš statinio metodo, turėtumėte atsižvelgti į tai, kad dizaino kvapas - t. Y. Blogo dizaino rodiklis. Išsamiau aptarsiu pašaipas, klastotes ir šmaikštus būsimame straipsnyje čia.

Kaip padaryti daugiau C #:

  • Kaip performuoti Dievo objektus C #
  • Kaip naudoti „ValueTask“ C #
  • Kaip naudoti nekintamumą C
  • Kaip naudoti const, readonly ir static C #
  • Kaip naudoti duomenų komentarus C #
  • Kaip dirbti su GU # C # 8
  • Kada naudoti abstrakčią klasę ir sąsają C #
  • Kaip dirbti su „AutoMapper“ C #
  • Kaip naudoti lambda išraiškas C #
  • Kaip dirbti su „Action“, „Func“ ir „Predicate“ delegatais C #
  • Kaip dirbti su delegatais C #
  • Kaip įdiegti paprastą kaupiklį C #
  • Kaip dirbti su atributais C #
  • Kaip dirbti su „Log4net“ C #
  • Kaip įgyvendinti saugyklos dizaino modelį C #
  • Kaip dirbti su atspindžiu C #
  • Kaip dirbti su failų stebėjimo programa C #
  • Kaip atlikti tingų inicializavimą C #
  • Kaip dirbti su MSMQ C #
  • Kaip dirbti su plėtinių metodais C #
  • Kaip mums lambda išraiškos C #
  • Kada naudoti nepastovų raktinį žodį C #
  • Kaip naudoti pajamingumo raktinį žodį C #
  • Kaip įgyvendinti polimorfizmą C #
  • Kaip sukurti savo užduočių planavimo priemonę C #
  • Kaip dirbti su „RabbitMQ“ C #
  • Kaip dirbti su dvigubu C #
  • Naršyti virtualius ir abstrakčius metodus C #
  • Kaip naudoti Dapper ORM C #
  • Kaip naudoti „flyweight“ dizaino modelį C #
$config[zx-auto] not found$config[zx-overlay] not found