Programmēšana

Kā lietot Moq, lai atvieglotu vienību testēšanu C #

Mums bieži ir jāraksta vienības testi kodam, kas piekļūst ārējam resursam, piemēram, datu bāzei vai failu failu sistēmai. Ja šādi resursi nav pieejami, vienīgais veids, kā nodrošināt testu izpildi, ir izveidojot izspēles objektus. Būtībā, izmantojot šo pamatā esošo atkarību viltus ieviešanu, varat pārbaudīt mijiedarbību starp pārbaudāmo metodi un tās atkarībām. Trīs no populārākajiem .Net izstrādātāju ņirgājošajiem ietvariem ir Rhino Mocks, Moq un NMock.

Starp tiem Moq var būt viselastīgākais un viegli lietojamais. Moq ietvars nodrošina elegantu veidu, kā iestatīt, pārbaudīt un pārbaudīt izspēles. Šis raksts piedāvā diskusiju par Moq un to, kā to var izmantot, lai izolētu koda vienības no to atkarības.

Darba sākšana ar Moq

Moq var izmantot, lai izveidotu izspēles objektus, kas simulē vai atdarina reālu objektu. Moq var izmantot, lai izsmietu gan klases, gan saskarnes. Tomēr jums jāzina daži ierobežojumi. Klases, par kurām izsmies, nevar būt statiskas vai aizzīmogotas, un metode, par kuru izsmiekls, ir jāatzīmē kā virtuāla. (Ņemiet vērā, ka šiem ierobežojumiem ir risinājumi. Jūs varētu izsmiet statisko metodi, izmantojot, piemēram, adaptera dizaina modeli.)

Pirmais Moq izmantošanas solis ir tā instalēšana, lai jūs to varētu izmantot vienības testa projektā. Moq varat lejupielādēt vietnē GitHub un pēc vajadzības pievienot atsauces. Tomēr es dodu priekšroku Moq instalēšanai, izmantojot NuGet, jo ir gan vieglāk, gan retāk palaist garām atsauces. Moq var instalēt, izmantojot šādu komandu komandrindā NuGet.

Install-Package Moq

Kā izsmiet saskarnes, izmantojot Moq

Sāksim ar ņirgāšanos par saskarni. Sintakse, lai izveidotu izspēles objektu, izmantojot Mock klasi, ir sniegta zemāk.

Izspēles mockObjectType = jauns izspēles ();

Tagad apsveriet šo interfeisu ar nosaukumu IAuthor.

publiskā saskarne IAuthor

    {

int Id {get; komplekts; }

virkne Vārds {get; komplekts; }

virkne Uzvārds {get; komplekts; }

    }

Izmantojot Moq ietvaru, jūs varat izveidot izspēles objektu, iestatīt rekvizītu vērtības, norādīt parametrus un atgriezt vērtības metodes izsaukumos. Šis koda fragments parāda, kā jūs varat izveidot instanci no IAuthor saskarnes, izmantojot Moq.

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

Ņemiet vērā, ka Mock klase pieder Moq ietvaram un satur vispārīgu konstruktoru, kas pieņem izveidojamā interfeisa veidu. Moq izmanto lambda izteicienu, delegātu un vispārīgo priekšrocības. Tas viss padara ietvara izmantošanu ļoti intuitīvu.

Šis koda fragments parāda, kā jūs varat izsmiet IAuthor saskarni un nodrošināt izsmietā gadījuma īpašības ar atbilstošām vērtībām. Ievērojiet, kā mēs izmantojam Assert, lai pārbaudītu izsmietā gadījuma rekvizītu vērtības.

var autors = new Mock ();

autors.SetupGet (p => p.Id). Atgriež (1);

autors.SetupGet (p => p.Vārda Vārds). Atgriešana (“Joydip”);

autors.SetupGet (p => p.LastName) .Atgriešanās (“Kanjilal”);

Assert.AreEqual (“Joydip”, autors.Object.FirstName);

Assert.AreEqual (“Kanjilal”, autors.Object.LastName);

Kā izsmiet metodes, izmantojot Moq

Tagad aplūkosim šādu klasi ar nosaukumu Raksts. Rakstu klasē ir tikai viena metode ar nosaukumu GetPublicationDate, kas pieņem raksta Id kā parametru un atgriež raksta publicēšanas datumu.

sabiedrības klases raksts

    {

publisks virtuālais DateTime GetPublicationDate (int articleId)

        {

mest jaunu NotImplementedException ();

        }

    }

Tā kā GetPublicationDate metode vēl nav ieviesta rakstu klasē, metode ir izsmieta, lai pašreizējo datumu atgrieztu kā publicēšanas datumu, kā parādīts tālāk sniegtajā koda fragmentā.

var mockObj = new Mock ();
mockObj.Setup (x => x.GetPublicationDate (It.IsAny ())). Atgriež ((int x) => DateTime.Now);

Iestatīšanas metodi izmanto, lai definētu tādas metodes darbību, kas tai tiek nodota kā parametrs. Šajā piemērā tas tiek izmantots, lai definētu GetPublicationDate metodes darbību. Zvans uz It.IsAny () nozīmē, ka metode GetPublicationDate pieņems vesela skaitļa parametru; attiecas uz statisko klasi. Metode Returns tiek izmantota, lai norādītu metodes atgriezes vērtību, kas norādīta iestatīšanas metodes izsaukumā. Šajā piemērā atgriešanas metode tiek izmantota, lai norādītu metodes atgriešanās vērtību kā pašreizējo sistēmas datumu.

Moq ļauj pārbaudīt, vai tika izsaukta konkrēta metode vai rekvizīts. Tālāk parādītais koda fragments to ilustrē.

mockObj.Verify (t => t.GetPublicationDate (It.IsAny ()));

Šeit mēs izmantojam verificēšanas metodi, lai noteiktu, vai izspēles objektā tika izsaukta GetPublicationDate.

Kā izsmiet bāzes klases metodes, izmantojot Moq

Apsveriet šādu koda daļu. Mums šeit ir divas klases - klase RepositoryBase un klase AuthorRepository, kas to paplašina.

publiskā abstraktā klase RepositoryBase

{

publiskā virtuālā Bool IsServiceConnectionValid ()

    {

// Daži kodi

    }

}

public class AuthorRepository: RepositoryBase

{

public void Saglabāt ()

    {

ja (IsServiceConnectionValid ())

        {

// Daži kodi

        }

    }

}

Tagad pieņemsim, ka mēs vēlamies pārbaudīt, vai datu bāzes savienojums ir derīgs. Tomēr mēs, iespējams, nevēlēsimies pārbaudīt visu kodu, kas atrodas metodē IsServiceConnectionValid. Piemēram, IsServiceConnectionValid metodē var būt kods, kas attiecas uz trešās puses bibliotēku. Mēs negribētu to pārbaudīt, vai ne? Šeit palīdz MoB CallBase metode.

Šādās situācijās, kad jums ir bāzes klases metode, kas ir ignorēta izsmietajā tipā, un jums ir nepieciešams izsmiet tikai ignorētās metodes bāzes versiju, varat izmantot CallBase. Šis koda fragments parāda, kā jūs varat izveidot daļēju izspēles objektu no AuthorRepository klases, iestatot rekvizītu CallBase uz true.

var mockObj = new Mock () {CallBase = true};

mockObj.Setup (x => x.IsServiceConnectionValid ()). Atgriež (true);

Moq ietvars ļauj viegli izveidot izspēles objektus, kas atdarina klašu un saskarņu darbību testēšanai, izmantojot tikai nepieciešamo funkcionalitāti. Lai uzzinātu vairāk par testēšanu ar izspēlēm, skatiet šo lielisko Martina Faulera rakstu.

$config[zx-auto] not found$config[zx-overlay] not found