Programmēšana

Kā testēt statiskās metodes C #

Veidojot vai strādājot .NET lietojumprogrammās, jūs bieži varat izmantot statiskas metodes. Metodes C # var būt statiskas vai nestacionāras. Non-static metodi (sauktu arī par instances metodi) var izmantot klases instancē, kurai tā pieder. Statiskām metodēm nav nepieciešams izmantot klases eksemplāru - tās var izsaukt pašā klasē.

Lai gan nav statiskas metodes (vismaz tādas, kas neizsauc statisku metodi vai mijiedarbojas ar ārējām atkarībām) pārbaude ir vienkārša, statiskas metodes pārbaude nebūt nav viegls uzdevums. Šajā rakstā ir runāts par to, kā jūs varat pārvarēt šo problēmu un pārbaudīt statiskās metodes C #.

[Arī par: Kā pārveidot Dieva objektus C #]

Lai strādātu ar šajā rakstā sniegtajiem kodu piemēriem, sistēmā jābūt instalētai Visual Studio 2019. Ja jums vēl nav kopijas, varat lejupielādēt Visual Studio 2019 šeit.

Visual Studio izveidojiet .NET Core konsoles lietojumprogrammas projektu

Vispirms izveidosim .NET Core Console lietojumprogrammas projektu Visual Studio. Pieņemot, ka Visual Studio 2019 ir instalēta jūsu sistēmā, veiciet tālāk norādītās darbības, lai Visual Studio izveidotu jaunu .NET Core konsoles lietojumprogrammas projektu.

  1. Palaidiet Visual Studio IDE.
  2. Noklikšķiniet uz “Izveidot jaunu projektu”.
  3. Logā “Izveidot jaunu projektu” parādīto veidņu sarakstā atlasiet “Console App (.NET Core)”.
  4. Noklikšķiniet uz Tālāk.
  5. Nākamajā logā “Konfigurēt jauno projektu” norādiet jaunā projekta nosaukumu un vietu.
  6. Noklikšķiniet uz Izveidot.

Tādējādi Visual Studio 2019 tiks izveidots jauns .NET Core konsoles lietojumprogrammas projekts. Līdzīgā veidā izveidojiet vēl divus projektus - klases bibliotēkas un vienības testa (xUnit test) projektu. Mēs izmantosim šos trīs projektus, lai ilustrētu statisko metožu vienības testēšanu šī raksta nākamajās sadaļās.

Kad statisko metodi var pārbaudīt un nevar pārbaudīt

Vienības testēšana ar statisku metodi neatšķiras no vienības, kas testē nestatisku metodi. Statiskās metodes pašas par sevi nav pārbaudāmas. Statisku metodi, kurai nav stāvokļa vai nemaina stāvokli, var pārbaudīt vienībā. Kamēr metode un tās atkarības ir idempotentas, metodi var pārbaudīt vienībā. Problēmas rodas, kad statiskā metode izsauc citas metodes vai kad pārbaudāmais objekts izsauc statisko metodi. No otras puses, ja pārbaudāmais objekts izsauc instances metodi, varat to viegli pārbaudīt.

Statisko metodi nevar pārbaudīt, ja ir kāds no šiem nosacījumiem:

  • Statiskā metode mijiedarbojas ar ārējām atkarībām, piemēram, datu bāzi, failu sistēmu, tīklu vai ārēju API.
  • Statiskā metode satur informāciju par stāvokli, t.i., ja tā datus ievieto klases statiskajā objektā.

Apsveriet šo koda fragmentu, kas parāda divas klases, proti, ProductBL un Logger. Kamēr ProductBL nav statiska klase, Logger ir statiska klase. Ņemiet vērā, ka reģistrēšanas klases rakstīšanas metode ir izsaukta no klases Product LogMessage metodes.

sabiedrības klase ProduktsBL

    {

public void LogMessage (virknes ziņojums)

        {

Logger.Write (ziņojums);

        }

    }

sabiedriskās klases mežizstrādātājs

    {

public static void Write (virknes ziņojums)

        {

// Lai reģistrētu datus, šeit ierakstiet savu kodu

        }

    }

Pieņemsim, ka reģistrētāja klases rakstīšanas metode izveido savienojumu ar datu bāzi un pēc tam datus raksta datu bāzes tabulā. Datubāzes nosaukums un tās tabula, kurā dati jāraksta, iespējams, ir iepriekš konfigurēts failā appsettings.json. Kā jūs tagad varat uzrakstīt ProductBL metodes vienības testus?

Ņemiet vērā, ka par statiskām metodēm nevar viegli izsmiet. Piemēram, ja jums ir divas klases ar nosaukumu A un B un A klasē tiek izmantots statisks B klases loceklis, jūs nevarētu vienot A klases testu atsevišķi.

Trīs veidi, kā testēt statiskās metodes

Jūs varat izmantot Moq, lai izsmietu ne statiskas metodes, bet to nevar izmantot, lai izsmietu statiskas metodes. Lai gan par statiskām metodēm nevar viegli izsmiet, ir daži veidi, kā izsmiet statiskās metodes.

Lai izsmietu statiskās metodes izsaukumus, varat izmantot Microsoft Moles vai Fakes ietvara priekšrocības. (Fakes ietvars tika iekļauts Visual Studio 2012 kā Moles pēctecis - tā ir nākamās paaudzes Moles un Stubs.) Vēl viens veids, kā izsmiet statisko metožu izsaukumus, ir delegātu izmantošana. Ir vēl viens veids, kā apšaubīt statiskās metodes izsaukumus lietojumprogrammā - izmantojot iesaiņojuma klases un atkarības injekciju.

IMHO šī pēdējā iespēja ir labākais problēmas risinājums. Viss, kas jums jādara, ir ietīt statiskās metodes izsaukumu instances metodē un pēc tam izmantot atkarības injekciju, lai iesaiņotu iesaiņošanas klases instanci pārbaudāmajā klasē.

Izveidojiet iesaiņošanas klasi C #

Šis koda fragments ilustrē LogWrapper klasi, kas ievieš IWrapper saskarni un aptver izsaukumu uz Logger.Write () metodi instances metodē ar nosaukumu LogData.

publiskā klase LogWrapper: IWrapper

    {

virkne _ziņojums = null;

publiskais LogWrapper (virknes ziņojums)

        {

_ziņojums = ziņojums;

        }

public void LogData (virknes ziņojums)

        {

_ziņojums = ziņojums;

Logger.Write (_ziņojums);

        }

    }

Šis koda fragments parāda IWrapper saskarni. Tas satur LogData metodes deklarāciju.

publiskā saskarne IWrapper

    {

void LogData (virknes ziņojums);

    }

Klase ProductBL izmanto atkarības iesmidzināšanu (konstruktora injekciju), lai injicētu LogWrapper klases gadījumu, kā parādīts zemāk norādītajā kodu sarakstā.

sabiedrības klase ProduktsBL

    {

tikai lasāms IWrapper _wrapper;

statiskā virkne _message = null;

publiskais produktsBL (IWrapper iesaiņotājs)

        {

_ ietinējs = ietinējs;

        }

public void LogMessage (virknes ziņojums)

        {

_ziņojums = ziņojums;

_wrapper.LogData (_ziņojums);

        }

    }

Klases ProductBL LogMessage metode izsauc LogData metodi iepriekš ievadītās LogWrapper klases instancē.

Izmantojiet xUnit un Moq, lai izveidotu vienības testa metodi C #

Atveriet failu UnitTest1.cs un pārdēvējiet UnitTest1 klasi uz UnitTestForStaticMethodsDemo. Faili UnitTest1.cs tiks automātiski pārdēvēti par UnitTestForStaticMethodsDemo.cs. Tagad mēs izmantosim Moq ietvaru, lai izveidotu, pārbaudītu un pārbaudītu izspēles.

Šis koda fragments parāda, kā jūs varat izmantot Moq ietvaru, lai vienotu testa metodes C #.

var izspēles = jauns izspēles ();

izspēles.Setup (x => x.LogData (It.IsAny ()));

jauns ProductBL (mock.Object) .LogMessage ("Sveika pasaule!");

izsmiet.VerifyAll ();

Veicot testu, Test Explorer logā ir jāizskatās šādi.

Pilns testa klases kodu saraksts ir norādīts zemāk.

publiskā klase UnitTestForStaticMethodsDemo

    {

[Fakts]

public void StaticMethodTest ()

        {

var izspēles = jauns izspēles ();

izspēles.Setup (x => x.LogData (It.IsAny ()));

jauns ProductBL (mock.Object) .LogMessage ("Sveika pasaule!");

izsmiet.VerifyAll ();

        }

    }

Vienības testēšana ir process, kurā tiek pārbaudītas koda vienības lietojumprogrammā, lai pārbaudītu, vai faktiskie jūsu vienības testa rezultāti atbilst vēlamajiem rezultātiem. Ja saprātīgi tiek izmantota, vienības testēšana var palīdzēt novērst kļūdas projekta izstrādes posmā.

Statiskās metodes var radīt vairākas problēmas, mēģinot tās pārbaudīt, izmantojot izspēles. Ja jūsu lietojumprogrammā jums ir nepieciešams izsmiet statisku metodi, jums jāņem vērā, ka dizaina smarža - t.i., slikta dizaina rādītājs. Turpmākajā rakstā es sīkāk apspriedīšu izspēles, viltojumus un cieņas.

Kā izdarīt vairāk C #:

  • Kā pārveidot Dieva objektus C #
  • Kā izmantot ValueTask C #
  • Kā izmantot nemainīgumu C
  • Kā lietot const, tikai lasāmu un statisku C #
  • Kā izmantot datu anotācijas C #
  • Kā strādāt ar GUID C # 8
  • Kad izmantot abstraktu klasi un saskarni C #
  • Kā strādāt ar AutoMapper C #
  • Kā lietot lambda izteicienus C #
  • Kā strādāt ar Action, Func un Predicate delegātiem C #
  • Kā strādāt ar delegātiem C #
  • Kā ieviest vienkāršu reģistrētāju C #
  • Kā strādāt ar atribūtiem C #
  • Kā strādāt ar log4net C #
  • Kā ieviest krātuves dizaina modeli C #
  • Kā strādāt ar refleksiju C #
  • Kā strādāt ar filesystemwatcher C #
  • Kā veikt slinku inicializāciju C #
  • Kā strādāt ar MSMQ C #
  • Kā strādāt ar paplašināšanas metodēm C #
  • Kā mums izteikt lambda izteicienus C #
  • Kad lietot svārstīgo atslēgvārdu C #
  • Kā izmantot ienesīguma atslēgvārdu C #
  • Kā ieviest polimorfismu C #
  • Kā izveidot savu uzdevumu plānotāju C #
  • Kā strādāt ar RabbitMQ C #
  • Kā strādāt ar dubultošanos C #
  • Virtuālu un abstraktu metožu izpēte C #
  • Kā lietot Dapper ORM C #
  • Kā izmantot lidojošā dizaina rakstu C #
$config[zx-auto] not found$config[zx-overlay] not found