Ohjelmointi

Kuinka käyttää Moq-yksikköä yksikkötestauksen helpottamiseksi C #: ssä

Meidän on usein kirjoitettava yksikötestit koodille, joka käyttää ulkoista resurssia, kuten tietokantaa tai tiedostotiedostojärjestelmää. Jos tällaisia ​​resursseja ei ole käytettävissä, ainoa tapa varmistaa, että testit voidaan suorittaa, on luomalla pilkkuobjekteja. Pohjimmiltaan, hyödyntämällä näiden taustalla olevien riippuvuuksien väärennettyjä toteutuksia, voit testata testattavan menetelmän ja sen riippuvuuksien välistä vuorovaikutusta. Kolme suosituinta .net-kehittäjien pilkkaavaa kehystä ovat Rhino Mocks, Moq ja NMock.

Näistä Moq voi olla joustavin ja helpoin käyttää. Moq-kehys tarjoaa tyylikkään tavan asettaa, testata ja todentaa pilkkuja. Tämä artikkeli esittelee keskustelun Moqista ja siitä, miten sitä voidaan käyttää eristämään koodiyksiköt riippuvuuksistaan.

Moq: n käytön aloittaminen

Moq: n avulla voit luoda pilkkoobjekteja, jotka simuloivat tai matkivat todellista objektia. Moq: lla voidaan pilkata sekä luokkia että rajapintoja. Sinun tulisi kuitenkin olla tietoinen muutamista rajoituksista. Pilkattavat luokat eivät voi olla staattisia tai sinetöityjä, ja pilkattava menetelmä tulisi merkitä virtuaaliseksi. (Huomaa, että näillä rajoituksilla on kiertotapoja. Voit pilkata staattista menetelmää hyödyntämällä esimerkiksi sovittimen suunnittelumallia.)

Ensimmäinen vaihe Moq: n käytössä on asentaa se, jotta voit käyttää sitä yksikön testiprojektissa. Voit ladata Moqin GitHubista ja lisätä viitteitä tarpeen mukaan. Pidän kuitenkin mieluummin Moqin asentamisesta NuGetin kautta, koska se on sekä helpompaa että vähemmän todennäköisesti ohittamatta viitteitä. Voit asentaa Moqin käyttämällä seuraavaa komentoa NuGet-komentorivillä.

Install-Package Moq

Kuinka pilkata rajapintoja Moq: n avulla

Aloitetaan pilkkaamalla käyttöliittymää. Syntaksi mock-objektin luomiseksi Mock-luokan avulla on annettu alla.

Mock mockObjectType = uusi Mock ();

Harkitse nyt seuraavaa käyttöliittymää nimeltä IAuthor.

julkinen käyttöliittymä IAuthor

    {

int Id {get; aseta; }

merkkijono Etunimi {get; aseta; }

merkkijono Sukunimi {get; aseta; }

    }

Moq-kehyksen avulla voit luoda malliobjektin, asettaa ominaisuusarvoja, määrittää parametreja ja palauttaa arvoja menetelmän kutsuille. Seuraava koodinpätkä kuvaa, kuinka voit luoda ilmentymän IAuthor-käyttöliittymästä Moq: n avulla.

var pilkata = uusi pilkata ();

Huomaa, että Mock-luokka kuuluu Moq-kehykseen ja sisältää yleisen konstruktorin, joka hyväksyy luodun käyttöliittymän tyypin. Moq hyödyntää lambda-ilmaisuja, edustajia ja geneerisiä tietoja. Kaikki tämä tekee kehyksen käytöstä erittäin intuitiivista.

Seuraava koodinpätkä osoittaa, kuinka voit pilkata IAuthor-käyttöliittymää ja antaa pilkatun ilmentymän ominaisuuksille sopivat arvot. Huomaa, kuinka käytämme Assertia pilkatun ilmentymän ominaisuuksien arvojen tarkistamiseen.

var author = uusi pilkkaa ();

author.SetupGet (p => p.Id) .Palauttaa (1);

author.SetupGet (p => p.Nimi) .Palauttaa (“Joydip”);

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

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

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

Kuinka pilkata menetelmiä Moq: lla

Tarkastellaan nyt seuraavaa luokkaa nimeltä Artikkeli. Artikkeliluokka sisältää vain yhden GetPublicationDate-nimisen menetelmän, joka hyväksyy artikkelin Id parametrina ja palauttaa artikkelin julkaisupäivän.

julkisen luokan artikkeli

    {

julkinen virtuaalinen DateTime GetPublicationDate (int articleId)

        {

heittää uusi NotImplementedException ();

        }

    }

Koska GetPublicationDate-menetelmää ei ole vielä otettu käyttöön artikkeliluokassa, menetelmää on pilkattu palauttamaan nykyinen päivämäärä julkaisupäivänä alla olevan koodinpätkän mukaisesti.

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

Asennusmenetelmää käytetään määrittämään sille parametrina välitetyn menetelmän käyttäytyminen. Tässä esimerkissä sitä käytetään määrittämään GetPublicationDate-menetelmän käyttäytyminen. Kutsu It.IsAny () tarkoittaa, että GetPublicationDate-menetelmä hyväksyy parametrin, jonka tyyppi on kokonaisluku; Se viittaa staattiseen luokkaan. Palautusmenetelmää käytetään määrittämään menetelmän paluuarvo, joka on määritetty asennusmenetelmäkutsussa. Tässä esimerkissä Returns-menetelmää käytetään määrittämään menetelmän palautusarvo nykyiseksi järjestelmän päivämääräksi.

Moq antaa sinun tarkistaa, onko tietty menetelmä tai ominaisuus kutsuttu. Seuraava koodinpätkä kuvaa tätä.

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

Tässä käytämme Vahvista-menetelmää sen määrittämiseksi, onko GetPublicationDate kutsuttu mock-objektille.

Kuinka pilkata perusluokan menetelmiä Moq: n avulla

Harkitse seuraavaa koodia. Meillä on täällä kaksi luokkaa - RepositoryBase-luokka ja AuthorRepository-luokka, joka laajentaa sitä.

julkinen abstrakti luokka RepositoryBase

{

julkinen virtuaalibooli IsServiceConnectionValid ()

    {

// Joitakin koodeja

    }

}

public class AuthorRepository: RepositoryBase

{

public void Tallenna ()

    {

if (IsServiceConnectionValid ())

        {

// Joitakin koodeja

        }

    }

}

Oletetaan nyt, että haluamme tarkistaa, onko tietokantayhteys voimassa. Emme kuitenkaan halua testata kaikkia koodeja IsServiceConnectionValid-menetelmän sisällä. Esimerkiksi IsServiceConnectionValid-menetelmä saattaa sisältää koodia, joka liittyy kolmannen osapuolen kirjastoon. Emme halua testata sitä, eikö? Tässä on MoB: n CallBase-menetelmä.

Tällaisissa tilanteissa, joissa sinulla on perusluokan menetelmä, joka on ohitettu pilkatulla tyypillä, ja sinun täytyy pilkata vain ohitetun menetelmän perusversiota, voit käyttää CallBasea. Seuraava koodinpätkä osoittaa, kuinka voit luoda AuthorRepository-luokan osittaisen pilkkoobjektin asettamalla CallBase-ominaisuudeksi tosi.

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

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

Moq-kehyksen avulla on helppo luoda pilkkoobjekteja, jotka jäljittelevät luokkien ja rajapintojen käyttäytymistä testattavaksi, vain tarvitsemasi toiminnot. Jos haluat lisätietoja testeistä pilkkujen kanssa, tutustu tähän loistavaan artikkeliin Martin Fowlerilta.