{"id":1901,"date":"2019-05-15T20:56:39","date_gmt":"2019-05-15T17:56:39","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=1901"},"modified":"2019-05-15T20:56:39","modified_gmt":"2019-05-15T17:56:39","slug":"behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/","title":{"rendered":".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD)"},"content":{"rendered":"<p>Agile bir development tak\u0131m\u0131 d\u00fc\u015f\u00fcnelim, Developer&#8217;\u0131ndan Product Owner&#8217;\u0131na, Scrum Master&#8217;\u0131ndan Stake Holder&#8217;lar\u0131na kadar hepsinin <strong>product development<\/strong> konusunda <strong>collaborative<\/strong> olarak birbirlerine ba\u011fl\u0131 bir \u015fekilde \u00e7al\u0131\u015f\u0131yor olduklar\u0131.<\/p>\n<p>Kula\u011fa harika geliyor de\u011fil mi? Ama maalesef bu her zaman %100 m\u00fcmk\u00fcn olmuyor.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/agile_team.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2694 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/agile_team.png\" alt=\"\" width=\"895\" height=\"586\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/agile_team.png 895w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/agile_team-300x196.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/agile_team-768x503.png 768w\" data-sizes=\"(max-width: 895px) 100vw, 895px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 895px; --smush-placeholder-aspect-ratio: 895\/586;\" \/><\/a><\/p>\n<p>Peki, bug\u00fcn ise <em><strong>Behavior Driven Development<\/strong><\/em> hakk\u0131nda konu\u015faca\u011f\u0131z.<\/p>\n<p>Bu makale kapsam\u0131nda <em>BDD<\/em> hakk\u0131ndaki bilgilerimizi tazeleyip hemen ard\u0131ndan <em><strong>macOS<\/strong><\/em> \u00fczerinde <em><strong>.<\/strong><strong>NET Core<\/strong><\/em> ve <strong><em>Visual Studio<\/em><\/strong>\u00a0kullanarak, i\u00e7erisinde bir tak\u0131m basit fonksiyonlar i\u00e7eren bir <em>API&#8217;\u0131<\/em>,<em> BDD y<\/em>akla\u015f\u0131m\u0131 ile geli\u015ftirmeye \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<blockquote><p>A\u00e7\u0131kcas\u0131 bu makaleyi tamamlayabilmek i\u00e7in, uzun bir s\u00fcredir <em>SpecFlow<\/em>&#8216;un, <em>.NET Core<\/em> support&#8217;unun gelmesini bekliyordum.<\/p><\/blockquote>\n<p><a href=\"\/wp-content\/uploads\/2017\/11\/bdd.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1902 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/11\/bdd.png\" alt=\"\" width=\"1200\" height=\"718\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/bdd.png 1200w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/bdd-300x180.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/bdd-768x460.png 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/bdd-1024x613.png 1024w\" data-sizes=\"(max-width: 1200px) 100vw, 1200px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1200px; --smush-placeholder-aspect-ratio: 1200\/718;\" \/><\/a><\/p>\n<p>Bu makale kapsam\u0131nda ise, a\u015fa\u011f\u0131daki ba\u015fl\u0131klara s\u0131ras\u0131yla de\u011finece\u011fiz:<\/p>\n<ol>\n<li>K\u0131saca<em> BDD<\/em>&#8216;\u0131 Hat\u0131rlamak<\/li>\n<li><em>BDD<\/em>&#8216;\u0131n Faydalar\u0131<\/li>\n<li><em>macOS <\/em>\u00fczerinde<em> .NET Core <\/em>ve<em> Visual Studio <\/em>ile<em> BDD<\/em><\/li>\n<\/ol>\n<h2>K\u0131saca <em>BDD<\/em>&#8216;\u0131 Hat\u0131rlamak<\/h2>\n<p>Temelini <em>Test Driven Development<\/em> (TDD) dan almakta olan <em>BDD<\/em>, \u00f6zellikle &#8220;<em>kaliteli kod<\/em>&#8221; \u00fcretimi \u00fczerine olduk\u00e7a fazla bir \u015fekilde yo\u011funla\u015fmaktad\u0131r.<\/p>\n<p>Hemen hemen ~2 y\u0131ll\u0131k deneyimlerime dayanarak <em>BDD<\/em>&#8216;nin bize sa\u011flad\u0131\u011f\u0131 en b\u00fcy\u00fck faydalar\u0131n\u0131 s\u00f6ylemem gerekirse e\u011fer, proje geli\u015ftirme a\u015famalar\u0131 s\u0131ras\u0131nda kar\u015f\u0131la\u015f\u0131lan <strong>ileti\u015fimden kaynakl\u0131<\/strong> zorluklara kar\u015f\u0131 \u00f6nemli bir arac\u0131 olmas\u0131 ve bize proje i\u00e7in harika dok\u00fcmantasyon sa\u011fl\u0131yor olmas\u0131d\u0131r diyebilirim.<\/p>\n<h3><strong>Peki, nedir bu ileti\u015fim zorluklar\u0131 ve neye sebep oluyor?<\/strong><\/h3>\n<p>Projeyi geli\u015ftirecek olan ekibin, m\u00fc\u015fterinin t\u00fcm ihtiya\u00e7lar\u0131n\u0131 do\u011fru bir \u015fekilde anlayabilmesi, genelde business ekiplerinin ellerindedir.<\/p>\n<p>Fakat bir \u00e7ok durumda business ekiplerinin teknik tarafa uzak olmalar\u0131ndan dolay\u0131 da, <strong>kalitesiz kod<\/strong> ve <strong>eksik ihtiya\u00e7lar<\/strong> da ortaya \u00e7\u0131kabilmektedir. <em>BDD<\/em> ise bu noktada &#8220;ortak bir dil&#8221; yaratarak, kar\u015f\u0131la\u015f\u0131lan bu durumu \u00e7\u00f6z\u00fcmleyebilmemize olanak sa\u011flamaktad\u0131r. Yani, developer&#8217;lar, test ekipleri ve business ekipleri aras\u0131nda ileti\u015fimin daha iyi bir hale gelebilmesi ve gereksinimlerin kolay bir \u015fekilde anla\u015f\u0131labilmesi i\u00e7in bir nevi <strong>rehberlik<\/strong>\u00a0yapmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca <em>BDD<\/em>, <strong>business outcome<\/strong>&#8216;\u0131na do\u011frudan katk\u0131 sa\u011flayacak olan <strong>behavior<\/strong>&#8216;lar\u0131, developer&#8217;lara, test ekiplerine ve business ekiplerine eri\u015filebilir bir \u015fekilde a\u00e7\u0131k\u00e7a tan\u0131mlamaktad\u0131r. <em>BDD<\/em>&#8216;da bu tan\u0131mlaman\u0131n odak noktas\u0131nda ise, <strong>user story<\/strong>\u00a0i\u00e7erisindeki gereksinimleri bulmak ve bunlara dayal\u0131 olarak <strong>acceptance<\/strong> test&#8217;lerini yazmak vard\u0131r. Yani projenin ba\u015ftan sona acceptance criteria&#8217;lar\u0131 do\u011frultusunda geli\u015ftirilmesi i\u00e7in bir yol \u00e7izmektedir.<\/p>\n<blockquote><p><em><strong>NOT<\/strong>: BDD<\/em> i\u00e7erisinde, m\u00fc\u015fteri de development s\u00fcrecinin i\u00e7erisine sokulmaktad\u0131r.<\/p><\/blockquote>\n<p><a href=\"\/wp-content\/uploads\/2017\/11\/bdd_process.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1909 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/11\/bdd_process.png\" alt=\"\" width=\"581\" height=\"329\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/bdd_process.png 581w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/bdd_process-300x170.png 300w\" data-sizes=\"(max-width: 581px) 100vw, 581px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 581px; --smush-placeholder-aspect-ratio: 581\/329;\" \/><\/a><\/p>\n<h3><strong>Senaryolar<\/strong><\/h3>\n<p><em>BDD<\/em> i\u00e7erisinde acceptance criteria&#8217;lar, &#8220;senaryolar&#8221; olarak tan\u0131mlanmaktad\u0131r. Senaryolar yap\u0131sald\u0131r ve bir \u00f6zelli\u011fin farkl\u0131 durumlarda veya farkl\u0131 parametreler ile nas\u0131l davranmas\u0131 gerekti\u011fini a\u00e7\u0131klamaktad\u0131r.<\/p>\n<p>\u00d6rne\u011fin:<\/p>\n<ul>\n<li>X ki\u015fisi Google&#8217;a girdi.<\/li>\n<li>Arama kutusuna &#8220;kedi&#8221; yazd\u0131.<\/li>\n<li>Kedi ile ilgili arama sonu\u00e7lar\u0131 ekrana geldi.<\/li>\n<\/ul>\n<p>Ek olarak senaryolar, &#8220;<em>Gherkin<\/em>&#8221; olarak adland\u0131r\u0131lan linguistic bir formatta yaz\u0131l\u0131p, <strong>Given<\/strong>, <strong>When<\/strong> ve <strong>Then<\/strong>\u00a0b\u00f6l\u00fcmlerinden olu\u015fmaktad\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/11\/given-when-then.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1912 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/11\/given-when-then.jpg\" alt=\"\" width=\"595\" height=\"349\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/given-when-then.jpg 595w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/11\/given-when-then-300x176.jpg 300w\" data-sizes=\"(max-width: 595px) 100vw, 595px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 595px; --smush-placeholder-aspect-ratio: 595\/349;\" \/><\/a><\/p>\n<ul>\n<li><strong>Given<\/strong>: Senaryonun context&#8217;ini a\u00e7\u0131klamaktad\u0131r.<\/li>\n<li><strong>When<\/strong>: Action&#8217;\u0131 tan\u0131mlamaktad\u0131r.<\/li>\n<li><strong>Then<\/strong>: Burada ise ne olaca\u011f\u0131, yani &#8220;outcome&#8221; tan\u0131mlanmaktad\u0131r.<\/li>\n<\/ul>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi senaryolar, basit bir kal\u0131p ile konu\u015fma dili olarak yaz\u0131ld\u0131\u011f\u0131 i\u00e7in, anla\u015f\u0131lmas\u0131 da t\u00fcm ekipler taraf\u0131ndan kolay bir hale gelmektedir ve ayr\u0131ca bir <strong>dok\u00fcmantasyon<\/strong> niteli\u011fi de ta\u015f\u0131maktad\u0131r.<\/p>\n<p>Bu konu hakk\u0131ndaki daha detayl\u0131 bilgiye ise, <em><a href=\"https:\/\/dannorth.net\/introducing-bdd\/\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> ula\u015fabilirsiniz.<\/p>\n<h2><em>BDD<\/em>&#8216;nin Faydalar\u0131<\/h2>\n<p>\u0130lk olarak\u00a0<em>BDD,<\/em> test otomasyon projelerinde de kullan\u0131lan y\u00f6ntemlerden birisidir. <em>Gherkin<\/em> format\u0131nda yaz\u0131lan test senaryolar\u0131n\u0131n &#8220;otomasyon s\u00fcrecinde&#8221; kullan\u0131lmas\u0131n\u0131n yan\u0131 s\u0131ra ise, projenin ya\u015fayan ve g\u00fcncel bir dok\u00fcmantasyonunun da olu\u015fmas\u0131n\u0131 ayr\u0131ca sa\u011flamaktad\u0131r.<\/p>\n<p>Genel olarak faydalar\u0131na bakt\u0131\u011f\u0131m\u0131zda ise:<\/p>\n<ul>\n<li>Ekibin her bir \u00fcyesi taraf\u0131ndan kullan\u0131labilecek, basit ve anla\u015f\u0131labilir bir dil sunmaktad\u0131r.<\/li>\n<li>\u0130\u015f birli\u011fini artt\u0131r\u0131p, geli\u015ftirmektedir.<\/li>\n<li>Odak noktas\u0131nda m\u00fc\u015fteri vard\u0131r ve uygulaman\u0131n davran\u0131\u015flar\u0131n\u0131 takip etmektedir.<\/li>\n<li>Projenin g\u00fcncel bir dok\u00fcmantasyonunu sa\u011flamaktad\u0131r.<\/li>\n<\/ul>\n<p>Bunlarla birlikte <em>BDD<\/em>, yaz\u0131l\u0131m geli\u015ftirme s\u00fcreci i\u00e7erisinde &#8220;<em>end user<\/em>&#8221; ve &#8220;<em>user acceptance<\/em>&#8221; testleri i\u00e7in harcanan zaman\u0131 da b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azaltmaktad\u0131r.<\/p>\n<h2><em>macOS<\/em> \u00fczerinde <em>.NET Core<\/em> ve <em>Visual Studio<\/em> ile <em>BDD<\/em><\/h2>\n<p>Bir e-ticaret firmas\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcnelim. Bizden kullan\u0131c\u0131lar\u0131n be\u011fendikleri \u00fcr\u00fcnleri favori listelerine ekleyebilmeleri i\u00e7in bir <em>API<\/em> geli\u015ftirmemiz isteniyor. Bu <em>API<\/em>&#8216;\u0131, <em>BDD<\/em> ile geli\u015ftirelim ve nas\u0131l i\u015fleyece\u011fini g\u00f6relim.<\/p>\n<p>Ben <em>API<\/em>&#8216;\u0131, <em>macOS<\/em> \u00fczerinde <em>Visual Studio<\/em> ve <em>.NET Core<\/em> 2.2 kullanarak geli\u015ftirece\u011fim. <em>BDD<\/em> framework&#8217;\u00fc olarak ise, <em>SpecFlow<\/em> kullanaca\u011f\u0131z.<\/p>\n<p><em>SpecFlow, <strong>.NET<\/strong><\/em> \u00e7at\u0131s\u0131 alt\u0131nda\u00a0<em><a href=\"https:\/\/github.com\/cucumber\/cucumber\/tree\/master\/gherkin\" target=\"_blank\" rel=\"noopener noreferrer\">Gherkin<\/a><\/em> parser&#8217;\u0131n\u0131 kullanarak human-readable acceptance test&#8217;leri tan\u0131mlayabilmemize ve y\u00f6netebilmemizi sa\u011flayan, open-source bir <em>Behavior Driven Design<\/em> framework&#8217;\u00fcd\u00fcr.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/12\/specflow-bdd.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1925 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/12\/specflow-bdd.png\" alt=\"\" width=\"868\" height=\"290\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/12\/specflow-bdd.png 868w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/12\/specflow-bdd-300x100.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/12\/specflow-bdd-768x257.png 768w\" data-sizes=\"(max-width: 868px) 100vw, 868px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 868px; --smush-placeholder-aspect-ratio: 868\/290;\" \/><\/a><\/p>\n<p>\u00d6ncelikle <em>macOS<\/em> \u00fczerinde <em>Visual Studio<\/em>&#8216;ya sahip de\u011filseniz, <em><span style=\"text-decoration: underline;\"><a href=\"https:\/\/visualstudio.microsoft.com\/vs\/mac\/\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/span><\/em> indirebilirsiniz. <em>Visual Studio<\/em>&#8216;yu a\u00e7t\u0131ktan sonra &#8220;<em>Extensions<\/em>&#8221; b\u00f6l\u00fcm\u00fcne girelim ve &#8220;<em>Gallery<\/em>&#8221; tab&#8217;\u0131na t\u0131klayal\u0131m. Search kutusuna &#8220;<em>Straight8&#8217;s SpecFlow Integration<\/em>&#8221; yazal\u0131m ve a\u015fa\u011f\u0131daki gibi ilgili extension&#8217;\u0131n kurulumunu ger\u00e7ekle\u015ftirelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow-extension.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2696 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow-extension.png\" alt=\"\" width=\"816\" height=\"312\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow-extension.png 816w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow-extension-300x115.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow-extension-768x294.png 768w\" data-sizes=\"(max-width: 816px) 100vw, 816px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 816px; --smush-placeholder-aspect-ratio: 816\/312;\" \/><\/a><\/p>\n<p>Bu extension sayesinde, projemize kolayl\u0131kla feature&#8217;lar ve step definition&#8217;lar ekleyebilece\u011fiz.<\/p>\n<p>\u015eimdi &#8220;<em>MyFavouriteAPI.Tests<\/em>&#8221; ad\u0131nda bir <em>.NET Core <\/em>2.2 <em>NUnit Test Projesi<\/em> olu\u015ftural\u0131m. Ard\u0131ndan s\u0131ras\u0131yla &#8220;<em>SpecFlow<\/em>&#8220;, &#8220;<em>SpecFlow.Tools.MsBuild.Generation<\/em>&#8221; ve &#8220;<em>SpecFlow.NUnit<\/em>&#8221; paket&#8217;lerini projeye <em>NuGet<\/em> \u00fczerinden dahil edelim.<\/p>\n<p>Genel configuration opsiyonlar\u0131 i\u00e7in ise, a\u015fa\u011f\u0131daki gibi &#8220;<em>specflow.json<\/em>&#8221; ad\u0131nda bir configuration file&#8217;\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"language\": {\r\n    \"feature\": \"en-US\"\r\n  }\r\n}<\/pre>\n<p>Bu opsiyon ile, feature file&#8217;lar\u0131n\u0131n \u0130ngilizce olaca\u011f\u0131n\u0131 belirtmi\u015f oluyoruz.<\/p>\n<p>Configuration file&#8217;\u0131n\u0131 olu\u015fturduktan sonra, &#8220;<em>Features<\/em>&#8221; ad\u0131nda bir klas\u00f6r olu\u015ftural\u0131m. Ard\u0131ndan bu klas\u00f6r i\u00e7erisine a\u015fa\u011f\u0131daki gibi &#8220;<em>FavouriteList<\/em>&#8221; ad\u0131nda bir feature dosyas\u0131 ekleyelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow_feature.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2697 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow_feature.png\" alt=\"\" width=\"711\" height=\"304\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_feature.png 711w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_feature-300x128.png 300w\" data-sizes=\"(max-width: 711px) 100vw, 711px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 711px; --smush-placeholder-aspect-ratio: 711\/304;\" \/><\/a><\/p>\n<p>Extension, template olarak bize a\u015fa\u011f\u0131daki gibi bir feature dosyas\u0131 yaratacakt\u0131r.<\/p>\n<pre class=\"lang:default decode:true \">Feature: Addition\r\n\tIn order to avoid silly mistakes\r\n\tAs a math idiot\r\n\tI want to be told the sum of two numbers\r\n\t\r\n@mytag\r\nScenario: Add two numbers\r\n\tGiven I have entered 50 into the calculator\r\n\tAnd I have entered 70 into the calculator\r\n\tWhen I press add\r\n\tThen the result should be 120 on the screen\r\n<\/pre>\n<p>\u015eimdi ise bu template&#8217;in i\u00e7eri\u011fini d\u00fczenleyerek, kendi feature senaryomuzu olu\u015ftural\u0131m.<\/p>\n<h3><strong>Senaryonun Tan\u0131mlanmas\u0131<\/strong><\/h3>\n<p>Feature olarak bizim istedi\u011fimiz \u015fey, &#8220;<em>kullan\u0131c\u0131lar\u0131n be\u011fendikleri \u00fcr\u00fcnleri daha sonra sat\u0131n alabilmeleri i\u00e7in, favori listeleri olu\u015fturup \u00fcr\u00fcn ekleyebilmeleri veya silebilme i\u015flemleri<\/em>&#8220;.<\/p>\n<p>Ozaman feature&#8217;\u0131 a\u015fa\u011f\u0131daki gibi d\u00fczenleyelim.<\/p>\n<pre class=\"lang:default decode:true\">Feature: Favourite List\r\n\tA simple favourite list that we can add or remove products in order to buy them later<\/pre>\n<p>\u015eimdi ilk senaryomuzu tan\u0131mlayal\u0131m. \u00d6ncelikle bir favori listesi olu\u015fturmaya ihtiyac\u0131m\u0131z var. Bunun i\u00e7in senaryo k\u0131sm\u0131na, &#8220;<em>yeni bir favori listesi olu\u015fturma<\/em>&#8221; i\u015flemi diyelim.<\/p>\n<p>Peki bu senaryo ne zaman ger\u00e7ekle\u015fecek, yani buradaki action nedir? Buradaki action&#8217;\u0131n tan\u0131m\u0131 i\u00e7in ise, &#8220;<em>yeni bir favori listesi olu\u015fturdu\u011fumda<\/em>&#8221; desek yeterli olur san\u0131r\u0131m. \u015eimdi bu i\u015flemin sonucunda ise ne olacak, buradaki outcome nedir?<\/p>\n<p>Bunun i\u00e7in ise, &#8220;favori listesi bo\u015f olarak olu\u015fturulmu\u015f olmal\u0131d\u0131r&#8221; diyebiliriz. Bu senaryodan yola \u00e7\u0131karak, feature dosyas\u0131n\u0131 ise a\u015fa\u011f\u0131daki gibi d\u00fczenleyelim.<\/p>\n<pre class=\"lang:default decode:true\">Feature: Favourite List\r\n    A simple favourite list that we can add or remove products in order to buy them later\r\n    \r\n@mytag\r\nScenario: Create a new favourite list\r\n    When I create a new favourite list\r\n    Then the favourite list should be created as empty<\/pre>\n<p>Yukar\u0131da tan\u0131mlam\u0131\u015f oldu\u011fumuz bu senaryo, yap\u0131lacak olan i\u015fi ne kadar da net anlat\u0131yor de\u011fil mi? Ekibin her bir \u00fcyesi taraf\u0131ndan kullan\u0131labilecek ve anla\u015f\u0131labilecek basit bir dil.<\/p>\n<h3><strong>Senaryonun Kodlanmas\u0131<\/strong><\/h3>\n<p>Senaryoyu tan\u0131mlaman\u0131n ard\u0131ndan, projemizi build edelim ve <em>IDE<\/em> \u00fczerinden &#8220;<em>Unit Tests<\/em>&#8221; pad&#8217;ine ge\u00e7elim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow_new_favourite_list.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2711 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow_new_favourite_list.jpg\" alt=\"\" width=\"1334\" height=\"257\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_new_favourite_list.jpg 1334w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_new_favourite_list-300x58.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_new_favourite_list-768x148.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_new_favourite_list-1024x197.jpg 1024w\" data-sizes=\"(max-width: 1334px) 100vw, 1334px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1334px; --smush-placeholder-aspect-ratio: 1334\/257;\" \/><\/a><\/p>\n<p>Ahha! Projeyi build etmenin ard\u0131ndan, bizim i\u00e7in &#8220;<em>CreateANewFavouriteList<\/em>&#8221; test&#8217;ini olu\u015fturmu\u015f durumda.<\/p>\n<p>Ozaman test&#8217;i run edelim ve sonucuna test result pad \u00fczerinde bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow_create_favourite_list_result.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2712 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow_create_favourite_list_result.jpg\" alt=\"\" width=\"478\" height=\"464\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_create_favourite_list_result.jpg 478w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_create_favourite_list_result-300x291.jpg 300w\" data-sizes=\"(max-width: 478px) 100vw, 478px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 478px; --smush-placeholder-aspect-ratio: 478\/464;\" \/><\/a><\/p>\n<p>Hen\u00fcz herhangi bir kod yazmad\u0131\u011f\u0131m\u0131z i\u00e7in &#8220;<em>No matching step definition found for one or more steps.<\/em>&#8221; mesaj\u0131n\u0131 bize veriyor.<\/p>\n<p>\u015eimdi ise senaryomuz ile alakal\u0131, step definition&#8217;lar\u0131 tan\u0131mlamam\u0131z gerekiyor. Bunun i\u00e7in ise, extension&#8217;\u0131n result pad&#8217;de bize vermi\u015f oldu\u011fu \u00f6rnek kod par\u00e7as\u0131n\u0131 kullanabiliriz.<\/p>\n<p>\u015eimdi &#8220;<em>StepDefinitions<\/em>&#8221; ad\u0131nda bir klas\u00f6r olu\u015ftural\u0131m ve i\u00e7erisinde, &#8220;<em>FavouriteListSteps<\/em>&#8221; ad\u0131nda bir class tan\u0131mlayal\u0131m.<\/p>\n<p>Ard\u0131ndan \u00f6rnek kod par\u00e7as\u0131n\u0131 kopyalayal\u0131m ve\u00a0a\u015fa\u011f\u0131daki gibi &#8220;<em>FavouriteListSteps<\/em>&#8221; class&#8217;\u0131 i\u00e7erisine yap\u0131\u015ft\u0131ral\u0131m.<\/p>\n<blockquote><p><em><strong>NOT<\/strong><\/em>: &#8220;<em>MyNamespace<\/em>&#8221; ve &#8220;<em>StepDefinitions<\/em>&#8221; k\u0131s\u0131mlar\u0131n\u0131 d\u00fczenlemeyi unutmayal\u0131m.<\/p><\/blockquote>\n<pre class=\"lang:default decode:true \">using System;\r\nusing TechTalk.SpecFlow;\r\n\r\nnamespace MyFavouriteAPI.Tests.StepDefinitions\r\n{\r\n    [Binding]\r\n    public class FavouriteListSteps\r\n    {\r\n        [When(@\"I create a new favourite list\")]\r\n        public void WhenICreateANewFavouriteList()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n\r\n        [Then(@\"the favourite list should be empty\")]\r\n        public void ThenTheFavouriteListShouldBeEmpty()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada ne yapmam\u0131z gerekti\u011fi gayet a\u00e7\u0131k, de\u011fil mi?<\/p>\n<p>Kodlamaya ba\u015flamadan \u00f6nce assertion&#8217;lar\u0131 kolayl\u0131kla yapabilmemiz i\u00e7in, projeye &#8220;<em>FluentAssertions<\/em>&#8221; paketini de <em>NuGet<\/em> \u00fczerinden dahil edelim.<\/p>\n<p>Ard\u0131ndan \u00f6rnek senaryomuzu ise, a\u015fa\u011f\u0131daki gibi kodlamaya ba\u015flayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using TechTalk.SpecFlow;\r\nusing System.Collections.Generic;\r\nusing FluentAssertions;\r\nusing System;\r\nusing System.Linq;\r\n\r\nnamespace MyFavouriteAPI.Tests.StepDefinitions\r\n{\r\n    [Binding]\r\n    public class FavouriteListSteps\r\n    {\r\n        private readonly IFavouriteService _favouriteService;\r\n        private int _favouriteListId;\r\n        private readonly int _userId;\r\n\r\n        public FavouriteListSteps()\r\n        {\r\n            _favouriteService = new FavouriteService();\r\n            _userId = 1;\r\n        }\r\n\r\n        [When(@\"I create a new favourite list\")]\r\n        public void WhenICreateANewFavouriteList()\r\n        {\r\n            _favouriteListId = _favouriteService.Create(_userId);\r\n        }\r\n\r\n        [Then(@\"the favourite list should be empty\")]\r\n        public void ThenTheFavouriteListShouldBeEmpty()\r\n        {\r\n            FavouriteList favouriteList = _favouriteService.GetFavouriteList(_userId, _favouriteListId);\r\n\r\n            favouriteList.Should().NotBeNull();\r\n            favouriteList.FavouriteListId.Should().Be(_favouriteListId);\r\n            favouriteList.ProductIds.Should().BeNull();\r\n\r\n        }\r\n    }\r\n\r\n    public class FavouriteList\r\n    {\r\n        public int FavouriteListId { get; set; }\r\n        public List&lt;int&gt; ProductIds { get; set; }\r\n    }\r\n\r\n    public interface IFavouriteService\r\n    {\r\n        int Create(int userId);\r\n        FavouriteList GetFavouriteList(int userId, int favouriteListId);\r\n    }\r\n\r\n    public class FavouriteService : IFavouriteService\r\n    {\r\n        private readonly Dictionary&lt;int, List&lt;FavouriteList&gt;&gt; favouriteListStore = new Dictionary&lt;int, List&lt;FavouriteList&gt;&gt;();\r\n\r\n        public int Create(int userId)\r\n        {\r\n            int favouriteListId = new Random().Next(10);\r\n\r\n            var newFavouriteList = new List&lt;FavouriteList&gt;\r\n            {\r\n                new FavouriteList { FavouriteListId = favouriteListId }\r\n            };\r\n\r\n            favouriteListStore.Add(userId, newFavouriteList);\r\n\r\n            return favouriteListId;\r\n        }\r\n\r\n        public FavouriteList GetFavouriteList(int userId, int favouriteListId)\r\n        {\r\n            if (favouriteListStore.TryGetValue(userId, out List&lt;FavouriteList&gt; userFavouriteList))\r\n            {\r\n                var favouriteList = userFavouriteList.FirstOrDefault(_ =&gt; _.FavouriteListId == favouriteListId);\r\n\r\n                return favouriteList;\r\n            }\r\n\r\n            return null;\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada basit\u00e7e &#8220;<em>When<\/em>&#8221; ve &#8220;<em>Then<\/em>&#8221; ad\u0131mlar\u0131m\u0131z\u0131 kodlad\u0131k. \u0130lk \u00f6nce kullan\u0131c\u0131 i\u00e7in yeni bir favori listesi yaratt\u0131k, ard\u0131ndan favori listesinin bo\u015f oldu\u011funu do\u011frulad\u0131k.<\/p>\n<p>\u015eimdi &#8220;<em>CreateANewFavouriteList<\/em>&#8221; test&#8217;ini tekrar \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow_create_list_success.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2714 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow_create_list_success.jpg\" alt=\"\" width=\"1130\" height=\"259\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_create_list_success.jpg 1130w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_create_list_success-300x69.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_create_list_success-768x176.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_create_list_success-1024x235.jpg 1024w\" data-sizes=\"(max-width: 1130px) 100vw, 1130px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1130px; --smush-placeholder-aspect-ratio: 1130\/259;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi test ba\u015far\u0131yla ge\u00e7ti.<\/p>\n<p>\u015eimdi feature&#8217;a yeni bir senaryo daha ekleyelim. Kullan\u0131c\u0131 art\u0131k favori listesine, \u00fcr\u00fcn ekleyebilmeli. Birde favori listesinden \u00fcr\u00fcn\u00fc silebilmeli.<\/p>\n<p>Bunun i\u00e7in senaryomuzu a\u015fa\u011f\u0131daki gibi geni\u015fletelim.<\/p>\n<pre class=\"lang:default decode:true \">Feature: Favourite List\r\n    A simple favourite list that we can add or remove products in order to buy them later\r\n    \r\n@mytag\r\nScenario: Create a new favourite list\r\n    When I create a new favourite list\r\n    Then the favourite list should be empty\r\n    \r\nScenario: Add a new product to the favourite list\r\n    Given I create a new favourite list\r\n    When I select the favourite list and press the add favourite button on the product detail page\r\n    Then the product should be added to the favourite list\r\n\r\nScenario: Remove a product from the favourite list\r\n    Given I create a new favourite list\r\n    And I select the favourite list and press the add favourite button on the product detail page\r\n    When I press the remove product button on the favourite list page\r\n    Then the product should be removed from the favourite list<\/pre>\n<p>Senaryoyu kaydettikten sonra projeyi tekrar build edelim ve &#8220;<em>Unit Tests<\/em>&#8221; pad&#8217;ine tekrar bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow_extended_feature.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2715 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow_extended_feature.jpg\" alt=\"\" width=\"1352\" height=\"364\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_extended_feature.jpg 1352w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_extended_feature-300x81.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_extended_feature-768x207.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_extended_feature-1024x276.jpg 1024w\" data-sizes=\"(max-width: 1352px) 100vw, 1352px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1352px; --smush-placeholder-aspect-ratio: 1352\/364;\" \/><\/a><\/p>\n<p>Build i\u015fleminin ard\u0131ndan, yeni tan\u0131mlam\u0131\u015f oldu\u011fumuz senaryo i\u00e7in de extension, &#8220;<em>AddANewProductToTheFavouriteList<\/em>&#8221; ve &#8220;<em>RemoveAProductFromTheFavouriteList<\/em>&#8221;\u00a0 isimli test&#8217;ler olu\u015fturulmu\u015f durumda.<\/p>\n<p>Test&#8217;leri run edelim ve yine test result pad ekran\u0131ndaki \u00f6rnek method snippet&#8217;lar\u0131n\u0131 alal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">No matching step definition found for one or more steps.\r\nusing System;\r\nusing TechTalk.SpecFlow;\r\n\r\nnamespace MyNamespace\r\n{\r\n    [Binding]\r\n    public class StepDefinitions\r\n    {\r\n        [Given(@\"I create a new favourite list\")]\r\n        public void GivenICreateANewFavouriteList()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n        \r\n        [When(@\"I select the favourite list and press the add favourite button on the product detail page\")]\r\n        public void WhenISelectTheFavouriteListAndPressTheAddFavouriteButtonOnTheProductDetailPage()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n        \r\n        [Then(@\"the product should be added to the favourite list\")]\r\n        public void ThenTheProductShouldBeAddedToTheFavouriteList()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n    }\r\n}\r\n\r\nNo matching step definition found for one or more steps.\r\nusing System;\r\nusing TechTalk.SpecFlow;\r\n\r\nnamespace MyNamespace\r\n{\r\n    [Binding]\r\n    public class StepDefinitions\r\n    {\r\n        [Given(@\"I create a new favourite list\")]\r\n        public void GivenICreateANewFavouriteList()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n        \r\n        [Given(@\"I select the favourite list and press the add favourite button on the product detail page\")]\r\n        public void GivenISelectTheFavouriteListAndPressTheAddFavouriteButtonOnTheProductDetailPage()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n        \r\n        [When(@\"I press the remove product button on the favourite list page\")]\r\n        public void WhenIPressTheRemoveProductButtonOnTheFavouriteListPage()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n        \r\n        [Then(@\"the product should be removed from the favourite list\")]\r\n        public void ThenTheProductShouldBeRemovedFromTheFavouriteList()\r\n        {\r\n            ScenarioContext.Current.Pending();\r\n        }\r\n    }\r\n}<\/pre>\n<p>\u015eimdi feature&#8217;\u0131 tamamlayabilmek i\u00e7in bizden beklemi\u015f oldu\u011fu bu davran\u0131\u015flar\u0131, &#8220;<em>FavouriteListSteps<\/em>&#8221; class&#8217;\u0131 i\u00e7erisinde a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:default decode:true\">using TechTalk.SpecFlow;\r\nusing System.Collections.Generic;\r\nusing FluentAssertions;\r\nusing System;\r\nusing System.Linq;\r\n\r\nnamespace MyFavouriteAPI.Tests.StepDefinitions\r\n{\r\n    [Binding]\r\n    public class FavouriteListSteps\r\n    {\r\n        private readonly IFavouriteService _favouriteService;\r\n        private int _favouriteListId;\r\n        private readonly int _userId;\r\n        private readonly int _productId;\r\n\r\n        public FavouriteListSteps()\r\n        {\r\n            _favouriteService = new FavouriteService();\r\n            _userId = 1;\r\n            _productId = 1;\r\n        }\r\n\r\n        [Given(@\"I create a new favourite list\")]\r\n        [When(@\"I create a new favourite list\")]\r\n        public void WhenICreateANewFavouriteList()\r\n        {\r\n            _favouriteListId = _favouriteService.Create(_userId);\r\n        }\r\n\r\n        [Then(@\"the favourite list should be empty\")]\r\n        public void ThenTheFavouriteListShouldBeEmpty()\r\n        {\r\n            FavouriteList favouriteList = _favouriteService.GetFavouriteList(_userId, _favouriteListId);\r\n\r\n            favouriteList.Should().NotBeNull();\r\n            favouriteList.FavouriteListId.Should().Be(_favouriteListId);\r\n            favouriteList.ProductIds.Should().BeEmpty();\r\n\r\n        }\r\n\r\n        [Given(@\"I select the favourite list and press the add favourite button on the product detail page\")]\r\n        [When(@\"I select the favourite list and press the add favourite button on the product detail page\")]\r\n        public void WhenISelectTheFavouriteListAndPressTheAddFavouriteButtonOnTheProductDetailPage()\r\n        {\r\n            _favouriteService.AddFavourite(_userId, _favouriteListId, _productId);\r\n        }\r\n\r\n        [Then(@\"the product should be added to the favourite list\")]\r\n        public void ThenTheProductShouldBeAddedToTheFavouriteList()\r\n        {\r\n            FavouriteList favouriteList = _favouriteService.GetFavouriteList(_userId, _favouriteListId);\r\n\r\n            favouriteList.Should().NotBeNull();\r\n            favouriteList.FavouriteListId.Should().Be(_favouriteListId);\r\n            favouriteList.ProductIds.Should().Contain(_productId);\r\n        }\r\n\r\n        [When(@\"I press the remove product button on the favourite list page\")]\r\n        public void WhenIPressTheRemoveProductButtonOnTheFavouriteListPage()\r\n        {\r\n            _favouriteService.RemoveProduct(_userId, _favouriteListId, _productId);\r\n        }\r\n\r\n        [Then(@\"the product should be removed from the favourite list\")]\r\n        public void ThenTheProductShouldBeRemovedFromTheFavouriteList()\r\n        {\r\n            FavouriteList favouriteList = _favouriteService.GetFavouriteList(_userId, _favouriteListId);\r\n\r\n            favouriteList.Should().NotBeNull();\r\n            favouriteList.FavouriteListId.Should().Be(_favouriteListId);\r\n            favouriteList.ProductIds.Should().NotContain(_productId);\r\n        }\r\n    }\r\n\r\n    public class FavouriteList\r\n    {\r\n        public int FavouriteListId { get; set; }\r\n        public List&lt;int&gt; ProductIds { get; set; }\r\n    }\r\n\r\n    public interface IFavouriteService\r\n    {\r\n        void AddFavourite(int userId, int favouriteListId, int productId);\r\n        int Create(int userId);\r\n        FavouriteList GetFavouriteList(int userId, int favouriteListId);\r\n        void RemoveProduct(int userId, int favouriteListId, int productId);\r\n    }\r\n\r\n    public class FavouriteService : IFavouriteService\r\n    {\r\n        private readonly Dictionary&lt;int, List&lt;FavouriteList&gt;&gt; favouriteListStore = new Dictionary&lt;int, List&lt;FavouriteList&gt;&gt;();\r\n\r\n        public void AddFavourite(int userId, int favouriteListId, int productId)\r\n        {\r\n            FavouriteList favouriteList = GetFavouriteList(userId, favouriteListId);\r\n\r\n            if(favouriteList != null)\r\n            {\r\n                favouriteList.ProductIds.Add(productId);\r\n            }\r\n        }\r\n\r\n        public int Create(int userId)\r\n        {\r\n            int favouriteListId = new Random().Next(10);\r\n\r\n            var newFavouriteList = new List&lt;FavouriteList&gt;\r\n            {\r\n                new FavouriteList \r\n                { \r\n                    FavouriteListId = favouriteListId,\r\n                    ProductIds = new List&lt;int&gt;() \r\n                }\r\n            };\r\n\r\n            favouriteListStore.Add(userId, newFavouriteList);\r\n\r\n            return favouriteListId;\r\n        }\r\n\r\n        public FavouriteList GetFavouriteList(int userId, int favouriteListId)\r\n        {\r\n            if (favouriteListStore.TryGetValue(userId, out List&lt;FavouriteList&gt; userFavouriteList))\r\n            {\r\n                var favouriteList = userFavouriteList.FirstOrDefault(_ =&gt; _.FavouriteListId == favouriteListId);\r\n\r\n                return favouriteList;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void RemoveProduct(int userId, int favouriteListId, int productId)\r\n        {\r\n            FavouriteList favouriteList = GetFavouriteList(userId, favouriteListId);\r\n\r\n            if (favouriteList != null)\r\n            {\r\n                favouriteList.ProductIds.Remove(productId);\r\n            }\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada bir ka\u00e7 noktaya de\u011finmek istiyorum. E\u011fer daha \u00f6nce implemente etti\u011fimiz benzer bir senaryo varsa, onu tekrardan kodlamam\u0131za gerek yok. Tek yapmam\u0131z gereken, feature file&#8217;\u0131nda da oldu\u011fu gibi, &#8220;<em>Given<\/em>&#8221; context&#8217;ini gerekli yere eklemek.<\/p>\n<p>\u00d6rne\u011fin favori listesine yeni bir \u00fcr\u00fcn ekleyebilmek ve silebilmek i\u00e7in, \u00f6nce bir favori listesi olu\u015fturmam\u0131z gerekmektedir. Bunun i\u00e7in ise daha \u00f6nce implemente etmi\u015f oldu\u011fuz &#8220;<em>WhenICreateANewFavouriteList<\/em>&#8221; method&#8217;una, &#8220;<em>[Given(@&#8221;I create a new favourite list&#8221;)]<\/em>&#8221; attribute&#8217;\u00fcn\u00fc eklememiz yeterli olacakt\u0131r.<\/p>\n<p>Devam\u0131nda ise, bizden beklenen davran\u0131\u015flar\u0131 implemente ettik. \u015eimdi &#8220;<em>Unit Tests<\/em>&#8221; pad&#8217;ine tekrar ge\u00e7elim ve t\u00fcm test&#8217;leri \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/05\/specflow_all_tests_passed.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2717 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/05\/specflow_all_tests_passed.jpg\" alt=\"\" width=\"991\" height=\"297\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_all_tests_passed.jpg 991w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_all_tests_passed-300x90.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_all_tests_passed-768x230.jpg 768w\" data-sizes=\"(max-width: 991px) 100vw, 991px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 991px; --smush-placeholder-aspect-ratio: 991\/297;\" \/><\/a><\/p>\n<p>Tada! &#8220;<em>FavouriteList<\/em>&#8221; feature&#8217;\u0131n\u0131n tamamlanabilmesi i\u00e7in gerekli t\u00fcm senaryolar ba\u015far\u0131yla ge\u00e7ti.<\/p>\n<p>Makalenin giri\u015f k\u0131sm\u0131nda <em>BDD<\/em>&#8216;nin faydalar\u0131ndan bahsederken, a\u015fa\u011f\u0131daki madde&#8217;lerden bahsetmi\u015ftik:<\/p>\n<ul>\n<li>Ekibin her bir \u00fcyesi taraf\u0131ndan kullan\u0131labilecek, basit ve anla\u015f\u0131labilir bir dil sunmaktad\u0131r.<\/li>\n<li>\u0130\u015f birli\u011fini artt\u0131r\u0131p, geli\u015ftirmektedir.<\/li>\n<li>Odak noktas\u0131nda m\u00fc\u015fteri vard\u0131r ve uygulaman\u0131n davran\u0131\u015flar\u0131n\u0131 takip etmektedir.<\/li>\n<li>Projenin g\u00fcncel bir dok\u00fcmantasyonunu sa\u011flamaktad\u0131r.<\/li>\n<\/ul>\n<p>\u015eimdi ise olu\u015fturmu\u015f oldu\u011fumuz feature file&#8217;\u0131na bir bakal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">Feature: Favourite List\r\n    A simple favourite list that we can add or remove products in order to buy them later\r\n    \r\n@mytag\r\nScenario: Create a new favourite list\r\n    When I create a new favourite list\r\n    Then the favourite list should be empty\r\n    \r\nScenario: Add a new product to the favourite list\r\n    Given I create a new favourite list\r\n    When I select the favourite list and press the add favourite button on the product detail page\r\n    Then the product should be added to the favourite list\r\n\r\nScenario: Remove a product from the favourite list\r\n    Given I create a new favourite list\r\n    And I select the favourite list and press the add favourite button on the product detail page\r\n    When I press the remove product button on the favourite list page\r\n    Then the product should be removed from the favourite list<\/pre>\n<p>Bu feature file, ekibin her bir \u00fcyesi taraf\u0131ndan kullan\u0131labilecek basit ve anla\u015f\u0131labilir bir dile sahip, projenin g\u00fcncel bir dok\u00fcmantasyonudur. Development s\u0131ras\u0131nda ise bizi, uygulaman\u0131n davran\u0131\u015flar\u0131n\u0131 takip ettirerek, kodumuza y\u00f6n vermi\u015ftir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p><em>BDD<\/em>, \u00f6zellikle product development konusunda collaborative olarak i\u015fbirli\u011fine ihtiya\u00e7 duyuldu\u011fu zamanlarda kullan\u0131labilecek \u00f6nemli bir methodology&#8217;dir. Kullan\u0131c\u0131y\u0131 ve uygulaman\u0131n davran\u0131\u015flar\u0131n\u0131 da oda\u011f\u0131na alarak, maintanance ve ek maliyetleri de minimize etmektedir. Ayr\u0131ca uygulaman\u0131n g\u00fcncel dok\u00fcmantasyonunu da olu\u015fturmas\u0131yla birlikte, test otomasyon s\u00fcrecine de b\u00fcy\u00fck \u00f6l\u00e7\u00fcde destek vermektedir.<\/p>\n<p>Link: <em><a href=\"https:\/\/github.com\/GokGokalp\/BDDSampleWithNetCoreSpecFlow\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/GokGokalp\/BDDSampleWithNetCoreSpecFlow<\/a><\/em><\/p>\n<h2>Referanslar<\/h2>\n<blockquote><p><em>https:\/\/specflow.org\/getting-started\/<\/em><br \/>\n<em>https:\/\/specflow.org\/documentation\/<\/em><br \/>\n<em>https:\/\/specflow.org\/2018\/specflow-3-public-preview-now-available\/<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Agile bir development tak\u0131m\u0131 d\u00fc\u015f\u00fcnelim, Developer&#8217;\u0131ndan Product Owner&#8217;\u0131na, Scrum Master&#8217;\u0131ndan Stake Holder&#8217;lar\u0131na kadar hepsinin product development konusunda collaborative olarak birbirlerine ba\u011fl\u0131 bir \u015fekilde \u00e7al\u0131\u015f\u0131yor olduklar\u0131. Kula\u011fa harika geliyor de\u011fil mi? Ama maalesef bu her zaman %100 m\u00fcmk\u00fcn olmuyor. Peki, bug\u00fcn ise Behavior Driven Development hakk\u0131nda&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">.NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD)<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":2727,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[505,417,527,178],"tags":[526,419,528,530,531,529],"class_list":["post-1901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-asp-net-core","category-behavior-driven-development","category-test-driven-development","tag-net-core","tag-asp-net-core","tag-bdd","tag-behavior-driven-development","tag-specflow","tag-tdd","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>.NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD) - 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\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD) - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-15T17:56:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_dotnet_core.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1136\" \/>\n\t<meta property=\"og:image:height\" content=\"435\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD)\",\"datePublished\":\"2019-05-15T17:56:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/\"},\"wordCount\":3692,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/05\\\/specflow_dotnet_core.jpg\",\"keywords\":[\".net core\",\"asp.net core\",\"bdd\",\"behavior driven development\",\"specflow\",\"tdd\"],\"articleSection\":[\".NET Core\",\"ASP.NET Core\",\"Behavior Driven Development\",\"Test Driven Development\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/\",\"name\":\".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD) - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/05\\\/specflow_dotnet_core.jpg\",\"datePublished\":\"2019-05-15T17:56:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/05\\\/specflow_dotnet_core.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/05\\\/specflow_dotnet_core.jpg\",\"width\":1136,\"height\":435},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Behavior Driven Development with .NET Core and Visual Studio for Mac\"}]},{\"@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":".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD) - 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\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/","og_locale":"tr_TR","og_type":"article","og_title":".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD) - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2019-05-15T17:56:39+00:00","og_image":[{"width":1136,"height":435,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_dotnet_core.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD)","datePublished":"2019-05-15T17:56:39+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/"},"wordCount":3692,"commentCount":4,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_dotnet_core.jpg","keywords":[".net core","asp.net core","bdd","behavior driven development","specflow","tdd"],"articleSection":[".NET Core","ASP.NET Core","Behavior Driven Development","Test Driven Development"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/","url":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/","name":".NET Core ve Visual Studio for Mac ile Behavior Driven Development (BDD) - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_dotnet_core.jpg","datePublished":"2019-05-15T17:56:39+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_dotnet_core.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/05\/specflow_dotnet_core.jpg","width":1136,"height":435},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/behavior-driven-development-with-dotnet-net-core-and-visual-studio-for-mac\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Behavior Driven Development with .NET Core and Visual Studio for Mac"}]},{"@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\/1901","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=1901"}],"version-history":[{"count":41,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1901\/revisions"}],"predecessor-version":[{"id":2728,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1901\/revisions\/2728"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/2727"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=1901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=1901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=1901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}