Programiranje

Kako uporabiti Moq za lažje enotno testiranje v jeziku C #

Pogosto moramo napisati enotne teste za kodo, ki dostopa do zunanjega vira, kot je baza podatkov ali datotečni sistem. Če takšni viri niso na voljo, je edini način, da zagotovite, da se lahko preskusi izvajajo, tako, da ustvarite lažne predmete. V bistvu lahko z uporabo ponarejenih izvedb teh osnovnih odvisnosti preizkusite interakcijo med preskušano metodo in njenimi odvisnostmi. Trije najbolj priljubljeni posmehljivi okviri za razvijalce .Net so Rhino Mocks, Moq in NMock.

Med njimi je Moq najbolj prilagodljiv in enostaven za uporabo. Okvir Moq ponuja eleganten način za nastavitev, preizkušanje in preverjanje posmehov. Ta članek predstavlja razpravo o Moq-u in kako ga lahko uporabimo za izolacijo enot kode od njihovih odvisnosti.

Uvod v Moq

Moq lahko uporabite za ustvarjanje lažnih predmetov, ki simulirajo ali posnemajo resnični predmet. Moq se lahko uporablja za norčevanje tako razredov kot vmesnikov. Vendar pa se morate zavedati nekaj omejitev. Razredi, ki jih je treba posmehovati, ne morejo biti statični ali zaprti, metoda, ki se posmehuje, pa mora biti označena kot virtualna. (Upoštevajte, da obstajajo rešitve za te omejitve. Lahko se posmehujete statični metodi, na primer tako, da izkoristite vzorec zasnove adapterja.)

Prvi korak pri uporabi Moq-a je namestitev, tako da ga lahko uporabite v svojem testnem projektu enote. Moq lahko prenesete iz GitHub in po potrebi dodate reference. Vendar raje namestim Moq prek NuGet-a, ker je lažje in manj verjetno, da boste zamudili reference. Moq lahko namestite z naslednjim ukazom v ukazni vrstici NuGet.

Namesti paket Moq

Kako se norčevati iz vmesnikov z Moq

Začnimo s posmehom vmesnika. Sintaksa za ustvarjanje lažnega predmeta z uporabo razreda Mock je podana spodaj.

Mock mockObjectType = novo Mock ();

Zdaj pa razmislite o naslednjem vmesniku z imenom IAuthor.

javni vmesnik IAuthor

    {

int Id {get; set; }

niz FirstName {get; set; }

niz Priimek {get; set; }

    }

Z uporabo okvira Moq lahko v klicih metode ustvarite lažni objekt, nastavite vrednosti lastnosti, določite parametre in vrnete vrednosti. Naslednji delček kode prikazuje, kako lahko ustvarite primerek iz vmesnika IAuthor s pomočjo Moq.

var mock = novo Mock ();

Upoštevajte, da razred Mock spada v okvir Moq in vsebuje generični konstruktor, ki sprejema vrsto vmesnika, ki ga želite ustvariti. Moq izkorišča lambda izraze, delegate in generike. Vse to omogoča uporabo ogrodja zelo intuitivno.

Naslednji delček kode prikazuje, kako se lahko posmehujete vmesniku IAuthor in lastnosti posmehanega primerka zagotovite z ustreznimi vrednostmi. Upoštevajte, kako s programom Assert preverjamo vrednosti lastnosti posmehanega primerka.

var avtor = nov Mock ();

author.SetupGet (p => p.Id). Vrne se (1);

author.SetupGet (p => p.FirstName) .Returns (“Joydip”);

author.SetupGet (p => p.LastName) .Returns (“Kanjilal”);

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

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

Kako se norčevati z metodami z Moq

Poglejmo zdaj naslednji razred z imenom Article. Razred Article vsebuje samo eno metodo, imenovano GetPublicationDate, ki sprejme ID članka kot parameter in vrne datum objave članka.

javni razred Article

    {

javni navidezni DateTime GetPublicationDate (int articleId)

        {

vrzi novo NotImplementedException ();

        }

    }

Ker metoda GetPublicationDate še ni implementirana v razredu Article, se je metoda posmehovala, da vrne trenutni datum kot datum objave, kot je prikazano v spodnjem delčku kode.

var mockObj = novo Mock ();
mockObj.Setup (x => x.GetPublicationDate (It.IsAny ())). Vrne ((int x) => DateTime.Now);

Način namestitve se uporablja za določanje obnašanja metode, ki ji je posredovana kot parameter. V tem primeru se uporablja za definiranje obnašanja metode GetPublicationDate. Klic k It.IsAny () pomeni, da bo metoda GetPublicationDate sprejela parameter tipa celo število; To se nanaša na statični razred. Metoda vrnitev se uporablja za določanje vrednosti vrnitve metode, ki je določena v klicu metode namestitve. V tem primeru se metoda Vrnitve uporablja za določitev vrnjene vrednosti metode kot trenutnega sistemskega datuma.

Moq vam omogoča, da preverite, ali je bila klicana določena metoda ali lastnost. Naslednji delček kode to ponazarja.

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

Tu uporabljamo metodo Preveri, da ugotovimo, ali je bil GetPublicationDate poklican za lažni objekt.

Kako se posmehovati metodam osnovnega razreda z Moq

Razmislite o naslednjem delu kode. Tu imamo dva razreda - razred RepositoryBase in razred AuthorRepository, ki ga razširi.

javni abstraktni razred RepositoryBase

{

javni navidezni bool IsServiceConnectionValid ()

    {

// Nekaj ​​kode

    }

}

javni razred AuthorRepository: RepositoryBase

{

javna praznina Shrani ()

    {

if (IsServiceConnectionValid ())

        {

// Nekaj ​​kode

        }

    }

}

Zdaj predpostavimo, da želimo preveriti, ali je povezava z bazo podatkov veljavna. Vendar morda ne bomo želeli preizkusiti vse kode znotraj metode IsServiceConnectionValid. Na primer, metoda IsServiceConnectionValid lahko vsebuje kodo, ki se nanaša na knjižnico drugega proizvajalca. Tega ne bi želeli preizkusiti, kajne? Tukaj priskoči na pomoč metoda CallBase v Moqu.

V takih situacijah, ko imate v osnovnem razredu metodo, ki je bila razveljavljena v posmehljivem tipu in se morate norčevati samo iz osnovne različice razveljavljene metode, lahko črpate na CallBase. Naslednji delček kode prikazuje, kako lahko ustvarite delni lažni objekt razreda AuthorRepository, tako da lastnost CallBase nastavite na true.

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

mockObj.Setup (x => x.IsServiceConnectionValid ()). Vrne (true);

Okvir Moq omogoča enostavno ustvarjanje lažnih predmetov, ki posnemajo vedenje razredov in vmesnikov za testiranje, s samo potrebno funkcionalnostjo. Za več informacij o testiranju z lažnimi ogledi si oglejte ta čudovit članek Martina Fowlerja.

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