<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnet.lv/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>Valdis Iljuconoks : Unit testing</title><link>http://dotnet.lv/blogs/vi/archive/tags/Unit+testing/default.aspx</link><description>Tagi: Unit testing</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>`Fakes’ iekš VS Dev ‘11</title><link>http://dotnet.lv/blogs/vi/archive/2012/04/06/fakes.aspx</link><pubDate>Fri, 06 Apr 2012 19:45:35 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:338131</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=338131</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=338131</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2012/04/06/fakes.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Interesanta lieta, kas varbūt nav tik bieži un daudz apskatīta lasot par jaunās versijas iespējām un jaunajām “fīčām” – Fakes Framework.&lt;/p&gt;    &lt;p&gt;Šī platforma paredzēta tieši vienumu testu efektīvākai un vieglākai rakstīšanai.&lt;/p&gt;    &lt;p&gt;Dažkārt vienumu testu veidošanas laikā ir nepieciešams simulēt kādas izmantotas komponentes uzvedību vai funkcionalitāti. Ja programma, kuru vēlas notestēt un pārējās komponentes ir veidotas ar ņemot vērā vienumu testu īpatnības (piemēram, komponentes paļaujas un izmanto funkcionalitāti, kas slēpjas aiz klašu interfeisiem, kurus “saņem” no ārpuses), tad lielas grūtības pareizu vienumu testu uzrakstīt parasti nesagādā problēmas.&lt;/p&gt;    &lt;p&gt;Problēmas parasti rodas situācijās, kad nepieciešams simulēt uzvedību kādai no komponentēm, kurai nav pieejams izejas kods, kurai nav iespējams pārrakstīt uzvedību (virtuālās metodes) vai arī kuras paļaujas uz kādu konkrētu iekodētu implementāciju, kuru izmainīt parasti sagādā problēmas.&lt;/p&gt;    &lt;p&gt;Pieņemsim, ir neliela metode, kas pārbauda entity “derīguma termiņu” un nosaka, vai šo entity var dzēst no sistēmas. Pieņemsim, ka entity no sistēma var tikai tad, kad tā tur pabijusi vairāk par 5 dienām, t.i., entity pievienošanas datums ir par 5 dienām mazāks nekā &lt;font face="Consolas"&gt;{sistēmas pašreizējais}&lt;/font&gt; datums. Un šajā vietā sākas interesantākais. &lt;font face="Consolas"&gt;{Pašreizējais datums}&lt;/font&gt; ir lieta, kuru parasti implementē ar &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now&lt;/font&gt;.&lt;/p&gt;    &lt;p&gt;Viss ir kārtībā un sistēma visticamāk arī uzvedīsies pareizi run-time laikā, bet jautājums: kā, lai pārbauda šāda veida kodu no vienumu testiem. Un vienumu testi noteikti gribēs pārbaudīt abus loģiskos zarus – kad entity pievienošanas laiks ir mazāks un kad ir lielāks par definētajām 5 dienām, tādā veidā tiešām pārliecinoties, ka abi loģikas zari nostrādā pareizi.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:84f3c5d6-d24e-4fcb-b4fb-2bf7907f9256" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; CanEntityRemove(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Entity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; entity)&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (entity == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;         &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;&amp;quot;entity&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; delta = entity.Added.Subtract(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Now);&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; delta.Days &amp;gt; 5;&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Viens no variantiem, būtu definēt pašiem savu datuma piegādātāja klasi, kas varētu atgriezt virtuālo laiku, ar kuru varētu veikt nepieciešamās manipulācijas pirms atgriešanas. Bet jautājums, ko darīt, ja vēlamies pārbaudīt &lt;strong&gt;*tieši*&lt;/strong&gt; šādu kodu? Talkā nāk Fakes Framework, kas pieejams Visual Studio Dev ’11 versijā.&lt;/p&gt;    &lt;p&gt;Lai aizvietotu &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;īpašības vērtības, nepieciešams vispirms vienumu testa projektam uz nepieciešamo references bibliotēku, kur definēta klase &lt;font face="Consolas"&gt;DateTime&lt;/font&gt;, izpildīt komandu “Add Fakes Assembly”.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_5FD0B393.png" rel="lightbox"&gt;&lt;img title="" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_069EC9D4.png" width="596" height="362" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šī komanda ģenerēs jaunu bibliotēku &lt;font face="Consolas"&gt;{OriginalName} + “.Fakes”&lt;/font&gt;. Par cik &lt;font face="Consolas"&gt;DateTime&lt;/font&gt; ir definēts mscorlib bibliotēkā, bet pēc noklusējuma tā nav redzama references sarakstā, tad pēc Fakes bibliotēkas ģenerācijas, pieejama ir mscorlib.4.0.0.0.Fakes bibliotēka, kas satur &lt;font face="Consolas"&gt;stubs&lt;/font&gt; vai &lt;font face="Consolas"&gt;shims&lt;/font&gt; objektu veidus.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_7F7F8D5B.png" rel="lightbox"&gt;&lt;img title="" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin:0px auto;display:block;padding-right:0px;border-top-width:0px;" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_5F64809E.png" width="336" height="519" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Microsoft Visual Studio Dev ‘11 pašlaik izmanto divu klašu “izbāžņu” veidus:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;strong&gt;Stub&lt;/strong&gt;: ir veids, kurā ģenerētā klase pilnībā ir spējīga aizvietot mērķa klasi, piedāvājot noklusēto uzvedību un funkcionalitāti visām virtuālajām vai abstraktajām metodēm, īpašībām un notikumiem. Šīs klašu “izkārtnes” iespējams ģenerēt arī interfeisiem un nemarķētām (non-sealed) klasēm. Savukārt pārējiem gadījumiem: statiskām vai ne-virtuālām metodēm jāģenerē būs &lt;strong&gt;Shim &lt;/strong&gt;veida aizbāžņi. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Shim&lt;/strong&gt;: ar šī veida palīdzību ir iespējams simulēt uzvedību statiskām vai ne-virutālām metodēm. Šī veida “izbāžņi” pārķers visus orģinālos izsaukumus un pāradresēs to alternatīvajai implementācijai. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Abu šo veidu klašu “izbāžņi” ļauj izmantot &lt;font face="Consolas"&gt;delegates&lt;/font&gt;, lai implementētu vai pārrakstītu nepieciešamo funkcionalitāti.&lt;/p&gt;    &lt;p&gt;Direktorija “Fakes/” satur sarakstu un papildus informāciju par bibliotēkām, kurām ir jāģenerē klašu “izbāžņi”.&lt;/p&gt;    &lt;p&gt;&lt;font face="Consolas"&gt;&amp;lt;Fakes xmlns=&amp;quot;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/fakes/2011/&amp;quot;"&gt;&lt;font face="Consolas"&gt;http://schemas.microsoft.com/fakes/2011/&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;Assembly Name=&amp;quot;mscorlib&amp;quot; Version=&amp;quot;4.0.0.0&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;lt;/Fakes&amp;gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ja gribam simulēt &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;īpašības vērtību, tad nozīmē, ka jāizmanto būs Shim veida ģenerācija, jo īpašība ir statiska.&lt;/p&gt;    &lt;p&gt;Lai darbotos &lt;font face="Consolas"&gt;Shim&lt;/font&gt; veida ģenerētās klases, vispirms nepieciešams ieslēgt &lt;font face="Consolas"&gt;Shim&lt;/font&gt; kontekstu vienuma testa izpildes laikā. &lt;font face="Consolas"&gt;Shim&lt;/font&gt; konteksts paļaujas uz speciāli veidotu &lt;font face="Consolas"&gt;TraceProfilerInstrumentationProvider&lt;/font&gt;, kas arī nodarbojas ar izsaukumu pārķeršanu.&lt;/p&gt;    &lt;p&gt;Tātad, ja vēlamies izmantot &lt;font face="Consolas"&gt;Shim&lt;/font&gt; veida klašu ģenerāciju, tad no sākuma jāieslēdz:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c3316a1d-b300-4bc8-82b5-d558c70410b2" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; CanEntityAddedOnJanuaryRemoved_Test()&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ShimsContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Create())&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ja aizmirsīsim kontekstu ievietot &lt;font face="Consolas"&gt;using&lt;/font&gt; blokā, tad simulācija būs spēkā visa &lt;font face="Consolas"&gt;AppDomain&lt;/font&gt; dzīves laikā. Tāpēc svarīgi ir atcerēties kontrolēt &lt;font face="Consolas"&gt;Shim&lt;/font&gt; konteksta scope. Pēc tam, kad &lt;font face="Consolas"&gt;Shim&lt;/font&gt; konteksts ir uzstādīts, ir nepieciešams nodot instrukcijas klasei, kura jāsimulē.&lt;/p&gt;    &lt;p&gt;Tas notiek ar lambda izteiksmes palīdzību:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c93eda98-a7ae-4398-83d3-81158d423a00" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ShimsContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Create())&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ShimDateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.NowGet = () =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(2012, 1, 1);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šajā gadījumā tiek simulēts &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;īpašības uzvedība un atgrieztā vērtība.&lt;/p&gt;    &lt;p&gt;Izpildot vienuma testu redzams, ka Shim konteksts strādā un patiešām &lt;font face="Consolas"&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now &lt;/font&gt;property atgriež nepieciešamo vērtību.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_064AACF2.png" rel="lightbox"&gt;&lt;img title="" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin:0px auto;display:block;padding-right:0px;border-top-width:0px;" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_662FA034.png" width="842" height="468" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ja nepieciešams, piemēram, aizvietot vispār &lt;font face="Consolas"&gt;EntityValidator&lt;/font&gt; loģiku un testēt pavisam kādu citu sistēmas apgabalu pieņemot , ka vienumu testā šai klasei vienmēr ir jāatgriež &lt;font face="Consolas"&gt;true &lt;/font&gt;vērtība?&lt;/p&gt;    &lt;p&gt;Tas nozīmē, ka iespējami ir 2 scenāriji:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Izmantojam &lt;font face="Consolas"&gt;Shims&lt;/font&gt; ģenerācijas veidu un pielietojam jau apskatīto tehnoloģiju, kā modificēt vērtības klasēm, kurām nespējam piekļūt vienkāršā veidā. &lt;/li&gt;      &lt;li&gt;Pārdefinējam metodi &lt;font face="Consolas"&gt;CanEntityRemove()&lt;/font&gt; par virtuālu un izmantojam &lt;font face="Consolas"&gt;Stub&lt;/font&gt; klašu “izbāzeņu” ģenerācijas veidu, lai simulētu, ka dzēst no sistēmas var entity ar jebkādu datumu. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Lai šāda veida uzvedību nosimulētu, nepieciešams atkal &lt;font face="Consolas"&gt;Stub&lt;/font&gt; ģenerētajai klasei noinstruēt, ka vienmēr neskatoties uz kādu entity pievienošanas datumu, jāatgriež vienmēr &lt;font face="Consolas"&gt;true&lt;/font&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a65d4d5c-2b79-49bf-8041-a59b4a18cf81" class="wlWriterEditableSmartContent" style="float:none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; CanEntityRemove_StubTest()&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; stub = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;StubEntityValidator&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;stub.CanEntityRemoveEntity = (entity =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; result = stub.CanEntityRemove(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Entity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {Added = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DateTime&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(2012, 12, 12)});&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;     &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.IsTrue(result);&lt;/span&gt;&lt;br /&gt; &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šāda veida Stub ģenerētu uz noinstruēt klases instance var padot tālāk jau citām komponentēm, kurām nepieciešama šis objekts.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=338131" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Unit+testing/default.aspx">Unit testing</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+Dev+11/default.aspx">Visual Studio Dev 11</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/.NET4.5/default.aspx">.NET4.5</category></item></channel></rss>