{"id":620,"date":"2016-05-13T00:45:30","date_gmt":"2016-05-12T21:45:30","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=620"},"modified":"2016-05-13T00:47:13","modified_gmt":"2016-05-12T21:47:13","slug":"unit-test-yazarken-kolay-mock-islemleri","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/unit-test-yazarken-kolay-mock-islemleri\/","title":{"rendered":"Unit Test Yazarken Pratik Mocklama"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bir s\u00fcredir architectural d\u00fczeyde\u00a0devam ettirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m yaz\u0131 serilerimi,\u00a0bu aralar vakit bulduk\u00e7a biraz daha test a\u011f\u0131rl\u0131kl\u0131 konulara kayd\u0131rmaya karar vermedim. \u00c7\u00fcnk\u00fc\u00a0birisi hen\u00fcz yaz\u0131l\u0131m projesi in\u015fa a\u015famas\u0131nda iken kaliteli bir \u015fekilde altyap\u0131 \u00fczerine kurulmas\u0131 ile ilgilenirken, bir di\u011feri ise h\u0131zla geli\u015fen ve b\u00fcy\u00fcyen projenin kod kalitesinin\u00a0s\u00fcreklili\u011fi ile\u00a0ilgilenmektedir de\u011fil mi?<\/p>\n<p>\u0130\u015fte bu noktada iki u\u00e7 aras\u0131nda bir \u015fekilde dengeyi\u00a0sa\u011flayamayarak hep ipin ucunu ka\u00e7\u0131r\u0131yoruz\/ka\u00e7\u0131yor. Her ne kadar projenin mimari altyap\u0131s\u0131na \u00f6nem veriyorsak, asl\u0131nda ayn\u0131 eforu bu kalitenin s\u00fcreklili\u011fini sa\u011flayabilmek ad\u0131na test senaryolar\u0131nda da g\u00f6stermeliyiz. (Tabi bu T\u00fcrkiye ko\u015fullar\u0131 g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, zaman\/maliyet oran\u0131na g\u00f6re her ne kadar teste \u00f6nem verildi\u011fi tart\u0131\u015f\u0131l\u0131r.)<\/p>\n<p>Her neyse test konusunun \u00f6nemini k\u0131saca bir kere daha hat\u0131rlatma iste\u011fimden sonra konumuza yava\u015f\u00e7a giri\u015f yapabiliriz.\u00a0:)<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/05\/PUZZLE-1-min.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-626 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/05\/PUZZLE-1-min.png\" alt=\"PUZZLE-1-min\" width=\"600\" height=\"385\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/05\/PUZZLE-1-min.png 600w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/05\/PUZZLE-1-min-300x193.png 300w\" data-sizes=\"(max-width: 600px) 100vw, 600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 600px; --smush-placeholder-aspect-ratio: 600\/385;\" \/><\/a><\/p>\n<p>Unit test yazarken kolay mock i\u015flemlerimizi yapabilmemizi sa\u011flayan\u00a0<strong>NSubstitute Framework<\/strong>&#8216;\u00fcnden bahsedece\u011fim bu yaz\u0131mda. Bu framework&#8217;den bahsetmeden \u00f6nce k\u0131saca <strong>Mock <\/strong>nedir ve\u00a0neden ihtiya\u00e7 duyar\u0131z&#8217;\u0131 bir hat\u0131rlamam\u0131zda fayda olaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<h4>Mock\/Mocklamak Nedir?<\/h4>\n<blockquote><p>Mock kavram\u0131 istedi\u011fimiz bir objenin <strong>yerine ge\u00e7ebilen fake objelerdir<\/strong>.\u00a0Bu objelerin istedi\u011fimiz gibi davranmalar\u0131n\u0131 sa\u011flayabiliriz.<\/p><\/blockquote>\n<h4>Mock\/Mocklamak Bize Ne Sa\u011flar?<\/h4>\n<ul>\n<li>Unit test bir birimi test etti\u011fi i\u00e7in, oradaki ak\u0131\u015f\u0131 test ederken bu ak\u0131\u015fa ba\u011fl\u0131 olan <strong>dependency<\/strong>&#8216;lerin test ak\u0131\u015f\u0131n\u0131 bozmamas\u0131n\u0131 sa\u011flar.<\/li>\n<li>Unit test i\u015flemini yaparken, test&#8217;i istedi\u011fimiz senaryoda <strong>y\u00f6nlendirebilmemizi<\/strong> sa\u011flar.<\/li>\n<li>Complex objelerin <strong>yava\u015fl\u0131klar\u0131ndan<\/strong> kurtulabilmemizi sa\u011flar.<\/li>\n<\/ul>\n<p>K\u0131saca Mock\u00a0kavram\u0131ndan bahsetti\u011fimize g\u00f6re art\u0131k yava\u015f\u00e7a kodlamaya ba\u015flayabiliriz. Haydi bakal\u0131m! :)<\/p>\n<blockquote><p>Not:\u00a0NSubstitute framework&#8217;\u00fc open-source&#8217;dur. <a href=\"https:\/\/github.com\/nsubstitute\/NSubstitute\">Buradan <\/a>ilgili repository&#8217;sine ula\u015fabilirsiniz.<\/p><\/blockquote>\n<p>\u00d6ncelikle Test Case&#8217;lerimizi yazabilmek i\u00e7in bir <strong>Unit Test<\/strong> projesi olu\u015ftural\u0131m. Olu\u015fturmu\u015f oldu\u011fumuz bu projeye &#8220;Nuget Package Manager&#8221; \u00fczerinden &#8220;NSubstitute&#8221; yazarak,\u00a0a\u015fa\u011f\u0131 g\u00f6rseldeki\u00a0framework&#8217;\u00fc kural\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/05\/NSubstitute.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-621 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/05\/NSubstitute.jpg\" alt=\"NSubstitute\" width=\"799\" height=\"243\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/05\/NSubstitute.jpg 799w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/05\/NSubstitute-300x91.jpg 300w\" data-sizes=\"(max-width: 799px) 100vw, 799px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 799px; --smush-placeholder-aspect-ratio: 799\/243;\" \/><\/a><\/p>\n<p>Gerekli kurulumu yapt\u0131ktan sonra test i\u015flemleri i\u00e7in basit bir senaryo haz\u0131rlayal\u0131m. Varsayal\u0131m ki bir e-ticaret sitesi geli\u015ftiriyoruz ve \u00fcr\u00fcn stok i\u015flemlerini yapabilmemiz i\u00e7in bir servisimiz bulunmakta. Bizim i\u00e7in kritik olan bu servis i\u00e7in ilgili business logic&#8217;inin bozulmad\u0131\u011f\u0131n\u0131 do\u011frulayabilmek ad\u0131na Unit Test yazmak istiyoruz. Bu senaryomuzu uyarlamak ad\u0131na basit bir \u015fekilde <strong>Test Driven Development<\/strong>&#8216;a uygun olarak haz\u0131rlayal\u0131m.<\/p>\n<blockquote><p>Not: Test i\u015flemlerimizi tam anlam\u0131yla ger\u00e7ekleyebilmemiz i\u00e7in kesinlikle projelerimizin Test Driven Development&#8217;a ve SOLID prensiplerine uygun bir \u015fekilde geli\u015ftirilmi\u015f olup, abstraction&#8217;lar\u0131n do\u011fru uygulanmas\u0131\u00a0gerekmektedir.<\/p><\/blockquote>\n<h4>NSubstitute ile Mock Olu\u015fturma<\/h4>\n<p>NSubstitute Framework&#8217;\u00fc ile kolayl\u0131kla Mock olu\u015fturabilmek i\u00e7in a\u015fa\u011f\u0131daki syntax&#8217;\u0131 kullanmam\u0131z yeterlidir.<\/p>\n<pre class=\"lang:c# decode:true\">var mockObject = Substitute.For&lt;T&gt;();<\/pre>\n<p>Bu i\u015flem sonucunda ilgili T tipimiz i\u00e7in bir Mock i\u015flemini ba\u015flataca\u011f\u0131m\u0131z\u0131 s\u00f6yl\u00fcyoruz ve ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 inject ediyoruz. Daha sonras\u0131nda ise\u00a0bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n hangi method i\u00e7in nas\u0131l davranmas\u0131 gerekti\u011fini, unit test senaryolar\u0131m\u0131z do\u011frultusunda a\u015fa\u011f\u0131daki syntax ile kolayl\u0131kla belirleyebiliyoruz.<\/p>\n<pre class=\"lang:default decode:true\">var mockObject = Substitute.For&lt;T&gt;();\r\n\r\nmockObject.Sum(Arg.Any&lt;int&gt;(),Arg.Any&lt;int&gt;());<\/pre>\n<p>Burada mockObject&#8217;in &#8220;T&#8221; tipinden &#8220;Sum&#8221; method&#8217;unun int tipinde iki parametre alaca\u011f\u0131n\u0131 belirtiyoruz. Dilersek de bu iki parametre sonucunda yapmas\u0131 gereken davran\u0131\u015f\u0131 da s\u00f6yleyebiliriz!<\/p>\n<pre class=\"lang:c# decode:true\">var mockObject = Substitute.For&lt;T&gt;();\r\n\r\nmockObject.Sum(Arg.Any&lt;int&gt;(),Arg.Any&lt;int&gt;())\r\n.Returns(10);<\/pre>\n<p>&#8220;Sum&#8221; method&#8217;unun i\u015flem sonucunda ise &#8220;Returns&#8221; extension&#8217;\u0131 ile geriye &#8220;10&#8221; de\u011ferini d\u00f6nmesi gerekti\u011fini s\u00f6yl\u00fcyoruz. \u0130\u015fte hepsi bu kadar.<\/p>\n<h4>\u00d6rnek Bir Unit Test Senaryosu ve Mock \u0130\u015flemi<\/h4>\n<p>\u015eimdi \u00f6rnek\u00a0projemiz i\u00e7in \u00f6ncelikle entity&#8217;leri tan\u0131mlayal\u0131m:<\/p>\n<pre class=\"lang:c# decode:true \">namespace UnitTestMockingSample\r\n{\r\n    public class Product\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public int Stock { get; set; }\r\n    }\r\n}<\/pre>\n<p><strong>Product<\/strong> entity&#8217;si basit bir \u015fekilde senaryo gere\u011fi sadece Id, Name ve Stock property&#8217;lerine sahip olacakt\u0131r.<\/p>\n<p>\u015eimdi contract&#8217;lar\u0131m\u0131z niteli\u011finde olan interface&#8217;lerimizi tan\u0131mlayal\u0131m:<\/p>\n<pre class=\"lang:c# decode:true \">namespace UnitTestMockingSample\r\n{\r\n    public interface IProductRepository\r\n    {\r\n        Product GetById(int productId);\r\n    }\r\n}<\/pre>\n<p><strong>IProductRepotistory<\/strong> Product i\u015flemlerimizi ger\u00e7ekle\u015ftirmemizi sa\u011flayan repository contract&#8217;\u0131m\u0131z niteli\u011findedir ve i\u00e7erisinde sadece &#8220;GetById&#8221; method&#8217;unu bar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<pre class=\"lang:c# decode:true \">namespace UnitTestMockingSample\r\n{\r\n    public interface IStockRepository\r\n    {\r\n        bool ChangeStock(Product product, int stock);\r\n    }\r\n}<\/pre>\n<p><strong>IStockRepository<\/strong> ise,\u00a0ilgili stock i\u015flemlerini farkl\u0131 bir tabloda ger\u00e7ekle\u015ftirecek olan repository contract&#8217;\u0131m\u0131zd\u0131r. &#8220;ChangeStock&#8221; method&#8217;u ile stock i\u015flemlerini ger\u00e7ekle\u015ftirecektir.<\/p>\n<pre class=\"lang:c# decode:true\">namespace UnitTestMockingSample\r\n{\r\n    public interface ILogger\r\n    {\r\n        void Log(string message);\r\n    }\r\n}<\/pre>\n<p><strong>ILogger<\/strong> ise, olmazsa olmaz\u0131m\u0131zd\u0131r. Her bir exception&#8217;u\u00a0&#8220;Log&#8221; method&#8217;u ile bir yerlerde kaydetmekteyiz. :)<\/p>\n<p>\u015eimdi geldik \u015fu me\u015fhur \u00fcr\u00fcn stok i\u015flemlerini ger\u00e7ekle\u015ftirecek olan servisi tan\u0131mlamaya.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\n\r\nnamespace UnitTestMockingSample.Business\r\n{\r\n    public class ProductStockService\r\n    {\r\n        private readonly IProductRepository _productRepository;\r\n        private readonly IStockRepository _stockRepository;\r\n        private readonly ILogger _logger;\r\n\r\n        public ProductStockService(IProductRepository productRepository, IStockRepository stockRepository, ILogger logger)\r\n        {\r\n            _productRepository = productRepository;\r\n            _stockRepository = stockRepository;\r\n            _logger = logger;\r\n        }\r\n\r\n        public bool ChangeStock(int productId, int stock)\r\n        {\r\n            Product product;\r\n\r\n            try\r\n            {\r\n                product = _productRepository.GetById(productId);\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                _logger.Log(ex.ToString());\r\n\r\n                return false;\r\n            }\r\n\r\n            if (product != null)\r\n            {\r\n                \/\/ bla bla stock i\u015flem business logic'leri...\r\n\r\n                return _stockRepository.ChangeStock(product, stock);\r\n            }\r\n            else\r\n            {\r\n                _logger.Log(\"Stok bilgisi de\u011fi\u015ftirilemedi.\");\r\n\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p><strong>ProductStockService<\/strong> class&#8217;\u0131 ise basit bir \u015fekilde\u00a0constructor arac\u0131l\u0131\u011f\u0131 ile inject etti\u011fi <strong>ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/strong> kullanarak, &#8220;ChangeStock&#8221; method&#8217;u ile ilgili stock i\u015flemlerini ger\u00e7ekle\u015ftirmektedir.<\/p>\n<p>Dikkat ederseniz Mock&#8217;un faydalar\u0131n\u0131 hat\u0131rlarken\u00a0bahsetmi\u015f oldu\u011fumuz; &#8220;Unit test bir birimi test etti\u011fi i\u00e7in, oradaki ak\u0131\u015f\u0131 test ederken bu ak\u0131\u015fa ba\u011fl\u0131 olan dependency\u2018lerin test ak\u0131\u015f\u0131n\u0131 bozmamas\u0131n\u0131 sa\u011flar.&#8221; k\u0131sm\u0131na bir kez daha dikkat \u00e7ekmek isterim. Bizim bu servis \u00fczerindeki yapmak istedi\u011fimiz i\u015flem &#8220;ChangeStock&#8221; method&#8217;unun ilgili stok de\u011fi\u015ftirme business logic&#8217;inin d\u00fczg\u00fcn \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131d\u0131r asl\u0131nda. Bizi ne o an &#8220;_productRepository&#8221; \u00fczerinden \u00fcr\u00fcn\u00fcn gelip gelmedi\u011fi ilgilendiriyor, nede &#8220;_stockRepository&#8221; i\u00e7erisindeki i\u015flem. \u0130\u015fte tam burada Mock objeler imdad\u0131m\u0131za ko\u015fuyor! Ger\u00e7ekte yoklar, ama asl\u0131nda varlar gibi. :) Buradaki amac\u0131m\u0131z i\u015fin \u00f6z\u00fcnde bu d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131m\u0131zdan kurtularak, as\u0131l hedefimiz d\u00fczg\u00fcn \u00e7al\u0131\u015fabilmesidir.<\/p>\n<h4><\/h4>\n<p>Haydi \u015fimdi\u00a0mock&#8217;layarak,\u00a0test senaryolar\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using Microsoft.VisualStudio.TestTools.UnitTesting;\r\nusing NSubstitute;\r\nusing UnitTestMockingSample.Business;\r\n\r\nnamespace UnitTestMockingSample\r\n{\r\n    [TestClass]\r\n    public class ProductStockServiceTests\r\n    {\r\n        private IProductRepository _productRepository;\r\n        private IStockRepository _stockRepository;\r\n        private ILogger _logger;\r\n\r\n        private ProductStockService _productStockService;\r\n\r\n        [TestInitialize]\r\n        public void Initialize()\r\n        {\r\n            _productRepository = Substitute.For&lt;IProductRepository&gt;();\r\n            _stockRepository = Substitute.For&lt;IStockRepository&gt;();\r\n            _logger = Substitute.For&lt;ILogger&gt;();\r\n\r\n            _productStockService = new ProductStockService(_productRepository, _stockRepository, _logger);\r\n        }\r\n\r\n        [TestMethod]\r\n        public void ChangeStock_WhenProductNotNull_Change()\r\n        {\r\n            \/\/ Arrange\r\n            _productRepository.GetById(Arg.Is&lt;int&gt;(a =&gt; a &lt; 10))\r\n                .Returns(new Product() { Name = \"Asus PDA\", Stock = 100});\r\n\r\n            _stockRepository.ChangeStock(Arg.Any&lt;Product&gt;(), Arg.Any&lt;int&gt;())\r\n                .Returns(true);\r\n\r\n            \/\/ Act\r\n            var result = _productStockService.ChangeStock(5, 50);\r\n\r\n            \/\/ Assert\r\n            Assert.IsTrue(result);\r\n        }\r\n\r\n        [TestMethod]\r\n        public void ChangeStock_WhenProductNull_WriteLogMessage()\r\n        {\r\n            \/\/ Act\r\n            _productStockService.ChangeStock(5, 50);\r\n\r\n            \/\/ Assert\r\n            _logger.Received().Log(Arg.Any&lt;string&gt;());\r\n        }\r\n\r\n        [TestCleanup]\r\n        public void Cleanup()\r\n        {\r\n            _productRepository = null;\r\n            _stockRepository = null;\r\n            _logger = null;\r\n        }\r\n    }\r\n}<\/pre>\n<p>ProductStockServiceTests\u00a0class&#8217;\u0131 \u00e7at\u0131s\u0131na bakt\u0131\u011f\u0131m\u0131zda, klasik olarak t\u00fcm testlerimiz &#8220;Initialize&#8221; ile ba\u015flay\u0131p, &#8220;Cleanup&#8221; method&#8217;u ile son buluyor. \u00a0Test yazma logic&#8217;imizde ise yine\u00a0standartlar do\u011frultusunda gidebilmek i\u00e7in\u00a0AAA (Arrange, Act, Assert) pattern&#8217;ini uyguluyoruz. Detayl\u0131 bilgi i\u00e7in <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/hh694602.aspx\">buradan<\/a>\u00a0ula\u015fabilirsiniz. \u015eimdi gelelim bakal\u0131m neler yapt\u0131k?<\/p>\n<p>T\u00fcm interface&#8217;lerimizi global olarak tan\u0131mlayarak, &#8220;Initialize&#8221; method&#8217;u i\u00e7erisinde bahsetmi\u015f oldu\u011fumuz:<\/p>\n<pre class=\"lang:c# decode:true \">Substitute.For&lt;T&gt;();<\/pre>\n<p>syntax&#8217;\u0131n\u0131 kullanarak, framework&#8217;e T tipindeki interface&#8217;lerimiz i\u00e7in mock i\u015flemini ger\u00e7ekle\u015ftirece\u011fimizi\u00a0belirttik.\u00a0Daha sonra &#8220;ChangeStock_WhenProductNotNull_Change&#8221; isminde bir \u00f6rnek senaryo olu\u015fturduk. Bu senaryo gere\u011fi stok de\u011fi\u015ftirme i\u015fleminin, product objesinin null gelmedi\u011fi durumlarda de\u011fi\u015fmesini beklemekteyiz. Bunun i\u00e7in method&#8217;un &#8220;Arrange&#8221; k\u0131sm\u0131nda,\u00a0<strong>ProductStockService<\/strong> class&#8217;\u0131n\u0131n &#8220;ChangeStock&#8221; i\u015flevini yerine getirebilmesi i\u00e7in ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 bulundu\u011fu &#8220;ProductRepository&#8221; ve &#8220;StockRepository&#8221; i\u00e7in senaryonun ba\u015far\u0131l\u0131 olup, business logic&#8217;i test edebilmemiz ad\u0131na, istedi\u011fimiz do\u011frultuda mock objeler olu\u015fturduk. Bunun i\u00e7in:<\/p>\n<pre class=\"lang:default decode:true \">Arg.Is&lt;T&gt;(expression)<\/pre>\n<p>syntax&#8217;\u0131 ile,\u00a0T tipinin int olaca\u011f\u0131n\u0131 ve 10&#8217;dan k\u00fc\u00e7\u00fck olaca\u011f\u0131n\u0131 belirttik. Bu i\u015flemin sonucunda ise, test senaryomuzun ba\u015far\u0131l\u0131 \u00e7al\u0131\u015fabilmesi ad\u0131na, geriye fake\u00a0bir <strong>Product<\/strong>\u00a0objesi\u00a0d\u00f6nmesi gerekti\u011fini s\u00f6yledik. \u0130kinci sat\u0131r\u0131nda ise, bu i\u015flemler sonucunda &#8220;StockRepository&#8221; i\u00e7erisindeki &#8220;ChangeStock&#8221; method&#8217;ununda:<\/p>\n<pre class=\"lang:c# decode:true\">Arg.Any&lt;Product&gt;(), Arg.Any&lt;int&gt;()<\/pre>\n<p>parametreleri ile Product ve int tipinde herhangi bir objenin gelebilece\u011fi\u00a0belirttik. Bunun sonucunda ise senaryomuz gere\u011fi ba\u015far\u0131l\u0131 bir sonu\u00e7 bekledi\u011fimiz i\u00e7in &#8220;true&#8221; de\u011ferini d\u00f6nmesini gerekti\u011fini s\u00f6yledik. Act k\u0131sm\u0131na bakt\u0131\u011f\u0131m\u0131zda ise art\u0131k <strong>ProductStockService<\/strong> class&#8217;\u0131 \u00fczerinde &#8220;ChangeStock&#8221; method&#8217;unu,\u00a0productId&#8217;si &#8220;5&#8221; ve stock de\u011feri ise &#8220;50&#8221; olarak \u00e7a\u011f\u0131rd\u0131k.<\/p>\n<p>Bu i\u015flemler sonucunda mock objelerimiz devreye girece\u011fi\u00a0i\u00e7in ilgili servis s\u0131n\u0131f\u0131 i\u00e7erisindeki business logic ba\u015far\u0131l\u0131 \u00e7al\u0131\u015facakt\u0131r ve\u00a0Assert k\u0131sm\u0131 true de\u011ferini alarak test senaryomuz\u00a0ba\u015far\u0131yla ger\u00e7ekle\u015fmi\u015f\u00a0olacakt\u0131r.<\/p>\n<p>Bir di\u011fer senaryomuz olan &#8220;ChangeStock_WhenProductNull_WriteLogMessage&#8221; method&#8217;una bakt\u0131\u011f\u0131m\u0131zda ise, Product objesinin null oldu\u011fu durumlarda, ba\u015far\u0131l\u0131 bir \u015fekilde log at\u0131p atamat\u0131\u011f\u0131m\u0131za bakmaktay\u0131z. Hi\u00e7 bir mock objesi kullanmad\u0131\u011f\u0131m\u0131z i\u00e7in ilgili servis \u00e7a\u011fr\u0131s\u0131 yap\u0131ld\u0131\u011f\u0131nda Product objesi null olaca\u011f\u0131 i\u00e7in &#8220;_logger.Log()&#8221; method&#8217;u devreye girecektir. Assert k\u0131sm\u0131nda ise yine\u00a0NSubstitute Framework&#8217;\u00fcn\u00fcn bize sa\u011flam\u0131\u015f oldu\u011fu &#8220;Received&#8221; extension&#8217;u ile, &#8220;_logger&#8221; class&#8217;\u0131 i\u00e7erisindeki &#8220;Log&#8221; method&#8217;unun herhangi bir string parametresi ile \u00e7a\u011fr\u0131l\u0131p \u00e7a\u011fr\u0131lmad\u0131\u011f\u0131n\u0131 kontrol ettirmekteyiz.<\/p>\n<p>Bunun gibi bir \u00e7ok kolayl\u0131k sunan bu extension&#8217;lara bakmak isterseniz e\u011fer, <a href=\"http:\/\/nsubstitute.github.io\/help\/actions-with-arguments\/\">buradan <\/a>ula\u015fabilirsiniz.<\/p>\n<p>B\u00f6ylelikle bir makalemin daha sonuna geldik. Bir sonraki makalelerimde g\u00f6r\u00fc\u015fmek\u00a0dile\u011fiyle.\u00a0 \u00d6rnek olarak ger\u00e7ekle\u015ftirmi\u015f oldu\u011fumuz projeye ekten ula\u015fabilirsiniz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/05\/UnitTestMockingSample.rar\">UnitTestMockingSample<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bir s\u00fcredir architectural d\u00fczeyde\u00a0devam ettirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m yaz\u0131 serilerimi,\u00a0bu aralar vakit bulduk\u00e7a biraz daha test a\u011f\u0131rl\u0131kl\u0131 konulara kayd\u0131rmaya karar vermedim. \u00c7\u00fcnk\u00fc\u00a0birisi hen\u00fcz yaz\u0131l\u0131m projesi in\u015fa a\u015famas\u0131nda iken kaliteli bir \u015fekilde altyap\u0131 \u00fczerine kurulmas\u0131 ile ilgilenirken, bir di\u011feri ise h\u0131zla geli\u015fen ve b\u00fcy\u00fcyen projenin kod&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/unit-test-yazarken-kolay-mock-islemleri\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Unit Test Yazarken Pratik Mocklama<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[178],"tags":[181,180,105,179,182,183,185,104,184],"class_list":["post-620","post","type-post","status-publish","format-standard","hentry","category-test-driven-development","tag-c-mock-yapmak","tag-c-unit-test","tag-mock-nedir","tag-mocklama","tag-nsubstitute","tag-nsubstitute-kullanimi","tag-test-driven-development","tag-unit-test","tag-unit-test-nedir","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Unit Test Yazarken Pratik Mocklama - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unit Test Yazarken Pratik Mocklama - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-12T21:45:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-05-12T21:47:13+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Unit Test Yazarken Pratik Mocklama\",\"datePublished\":\"2016-05-12T21:45:30+00:00\",\"dateModified\":\"2016-05-12T21:47:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/\"},\"wordCount\":1411,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"C# Mock Yapmak\",\"C# Unit Test\",\"Mock Nedir\",\"Mocklama\",\"NSubstitute\",\"NSubstitute Kullan\u0131m\u0131\",\"Test Driven Development\",\"Unit Test\",\"Unit Test Nedir\"],\"articleSection\":[\"Test Driven Development\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/\",\"name\":\"Unit Test Yazarken Pratik Mocklama - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-05-12T21:45:30+00:00\",\"dateModified\":\"2016-05-12T21:47:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/unit-test-yazarken-kolay-mock-islemleri\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unit Test Yazarken Pratik Mocklama\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Unit Test Yazarken Pratik Mocklama - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Unit Test Yazarken Pratik Mocklama - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-05-12T21:45:30+00:00","article_modified_time":"2016-05-12T21:47:13+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Unit Test Yazarken Pratik Mocklama","datePublished":"2016-05-12T21:45:30+00:00","dateModified":"2016-05-12T21:47:13+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/"},"wordCount":1411,"commentCount":5,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["C# Mock Yapmak","C# Unit Test","Mock Nedir","Mocklama","NSubstitute","NSubstitute Kullan\u0131m\u0131","Test Driven Development","Unit Test","Unit Test Nedir"],"articleSection":["Test Driven Development"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/","url":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/","name":"Unit Test Yazarken Pratik Mocklama - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-05-12T21:45:30+00:00","dateModified":"2016-05-12T21:47:13+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/unit-test-yazarken-kolay-mock-islemleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Unit Test Yazarken Pratik Mocklama"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=620"}],"version-history":[{"count":6,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/620\/revisions"}],"predecessor-version":[{"id":629,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/620\/revisions\/629"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}