{"id":32933,"date":"2025-10-27T13:01:44","date_gmt":"2025-10-27T10:01:44","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/"},"modified":"2025-10-27T13:01:44","modified_gmt":"2025-10-27T10:01:44","slug":"umbraco-api-ile-kabul-testleri-tdd-pratigi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/","title":{"rendered":"Umbraco API ile Kabul Testleri: TDD Prati\u011fi"},"content":{"rendered":"<p><body><\/p>\n<p>Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco&#8217;nun g\u00fc\u00e7l\u00fc y\u00f6netim API&#8217;sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.<\/p>\n<p>Modern web projeleri, \u00f6zellikle i\u00e7erik y\u00f6netim sistemleri (CMS) \u00fczerinde geli\u015ftirilenler, s\u00fcrekli bir de\u011fi\u015fim ve evrim i\u00e7indedir. Umbraco gibi esnek ve geli\u015ftirici dostu bir CMS ile \u00e7al\u0131\u015f\u0131rken, \u00f6zelle\u015ftirmeler, eklentiler ve yeni \u00f6zellikler s\u0131k\u00e7a devreye al\u0131n\u0131r. Ancak bu dinamik yap\u0131, beraberinde ciddi riskler de getirir: Yaz\u0131lan kodun beklenen gibi \u00e7al\u0131\u015fmamas\u0131, mevcut \u00f6zelliklerin bozulmas\u0131 veya yeni eklenen bir fonksiyonun genel sistem kararl\u0131l\u0131\u011f\u0131n\u0131 etkilemesi gibi durumlarla s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131labilir. Manuel test s\u00fcre\u00e7leri zaman al\u0131c\u0131d\u0131r, hataya a\u00e7\u0131kt\u0131r ve \u00f6zellikle b\u00fcy\u00fck projelerde s\u00fcrd\u00fcr\u00fclebilir de\u011fildir. Bu noktada, yaz\u0131l\u0131m kalitesini ba\u015ftan sona g\u00fcvence alt\u0131na alacak sa\u011flam bir stratejiye ihtiya\u00e7 duyar\u0131z. \u0130\u015fte tam da burada Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) ve kabul testleri devreye giriyor.<\/p>\n<p>TDD, geli\u015ftirme s\u00fcrecini testlerin y\u00f6nlendirdi\u011fi bir metodolojidir. Bir \u00f6zelli\u011fi yazmadan \u00f6nce, o \u00f6zelli\u011fin nas\u0131l davranmas\u0131 gerekti\u011fini tan\u0131mlayan bir test yaz\u0131l\u0131r. Bu test ba\u015flang\u0131\u00e7ta ba\u015far\u0131s\u0131z olur (Red), ard\u0131ndan testin ge\u00e7mesini sa\u011flayacak minimum kod yaz\u0131l\u0131r (Green) ve son olarak kod kalitesi iyile\u015ftirilir (Refactor). Bu d\u00f6ng\u00fc, yaz\u0131l\u0131m\u0131n daha sa\u011flam, bak\u0131m\u0131 daha kolay ve daha hatas\u0131z olmas\u0131n\u0131 sa\u011flar. Ancak TDD&#8217;nin bir ad\u0131m \u00f6tesi vard\u0131r: Kabul testleri. Kabul testleri, son kullan\u0131c\u0131n\u0131n veya i\u015f biriminin beklentilerini kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in yaz\u0131l\u0131r. Yani, bir \u00f6zelli\u011fin sadece teknik olarak do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda i\u015f gereksinimlerine uygun olup olmad\u0131\u011f\u0131n\u0131 da kontrol eder. Umbraco y\u00f6netim API&#8217;si ile bu testleri yazmak, i\u00e7erik olu\u015fturma, g\u00fcncelleme, silme ve di\u011fer back-office i\u015flemlerini programatik olarak do\u011frulaman\u0131za olanak tan\u0131r. B\u00f6ylece, hem geli\u015ftirme s\u00fcreciniz h\u0131zlan\u0131r hem de projenizin genel kalitesi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi art\u0131r\u0131l\u0131r. Bu makale boyunca, bu kavramlar\u0131 Umbraco ba\u011flam\u0131nda nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Unutmamak gerekir ki, manuel testler zamanla maliyetli hale gelirken, otomatik testler uzun vadede hem zaman hem de kaynak tasarrufu sa\u011flar. Bu y\u00fczden, Umbraco projelerinizde daha g\u00fcvenli ve h\u0131zl\u0131 ilerlemek i\u00e7in bu yakla\u015f\u0131mlar\u0131 benimsemek kritik \u00f6neme sahiptir.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: Otomatik kabul testleri, \u00f6zellikle b\u00fcy\u00fck ve \u00e7ok ekipli Umbraco projelerinde, farkl\u0131 geli\u015ftiricilerin kodlar\u0131n\u0131n birbiriyle \u00e7ak\u0131\u015fma riskini azaltarak entegrasyon sorunlar\u0131n\u0131 erkenden tespit etmenizi sa\u011flar. Bu, proje ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn ilerleyen a\u015famalar\u0131nda ortaya \u00e7\u0131kabilecek pahal\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7er.\n    <\/div>\n<h2>Temel Kavramlar: TDD, Kabul Testleri ve Umbraco Y\u00f6netim API&#8217;si Nedir?<\/h2>\n<p>Umbraco projelerimizde kaliteyi art\u0131rmak i\u00e7in kullanaca\u011f\u0131m\u0131z ara\u00e7lar\u0131 ve metodolojiyi anlamak, ba\u015far\u0131l\u0131 bir uygulama i\u00e7in temel te\u015fkil eder. Bu b\u00f6l\u00fcmde, test g\u00fcd\u00fcml\u00fc geli\u015ftirme, kabul testleri ve Umbraco&#8217;nun sundu\u011fu y\u00f6netim API&#8217;sinin ne anlama geldi\u011fini ve neden bu kadar \u00f6nemli olduklar\u0131n\u0131 detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h3>Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) Yakla\u015f\u0131m\u0131: Neden Bu Kadar Pop\u00fcler?<\/h3>\n<p>Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD), yaz\u0131l\u0131m geli\u015ftirmede devrim niteli\u011finde bir yakla\u015f\u0131md\u0131r. Geleneksel olarak kod yaz\u0131l\u0131r ve sonras\u0131nda test edilirken, TDD bu s\u0131ralamay\u0131 tersine \u00e7evirir. TDD, &#8220;Red-Green-Refactor&#8221; (K\u0131rm\u0131z\u0131-Ye\u015fil-Yeniden D\u00fczenle) ad\u0131 verilen \u00fc\u00e7 ad\u0131ml\u0131 bir d\u00f6ng\u00fcde ilerler:<\/p>\n<ol>\n<li><b>Red (K\u0131rm\u0131z\u0131):<\/b> \u0130lk olarak, hen\u00fcz var olmayan bir \u00f6zelli\u011fi tan\u0131mlayan, ba\u015far\u0131s\u0131z olacak bir otomatik test yaz\u0131l\u0131r. Bu, geli\u015ftiricinin neyi ba\u015farmas\u0131 gerekti\u011fini net bir \u015fekilde anlamas\u0131na yard\u0131mc\u0131 olur ve yaz\u0131l\u0131m\u0131n beklentilerini somutla\u015ft\u0131r\u0131r.<\/li>\n<li><b>Green (Ye\u015fil):<\/b> Yaz\u0131lan testin ge\u00e7mesini sa\u011flayacak en basit kodu yaz\u0131l\u0131r. Bu a\u015famada kodun kalitesi veya m\u00fckemmeliyeti ikinci plandad\u0131r; tek ama\u00e7 testi ge\u00e7irmektir.<\/li>\n<li><b>Refactor (Yeniden D\u00fczenle):<\/b> Test ba\u015far\u0131yla ge\u00e7tikten sonra, kodun kalitesi, okunabilirli\u011fi, performans\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi iyile\u015ftirilir. Bu a\u015famada testlerin ba\u015far\u0131s\u0131z olmamas\u0131 kritik \u00f6neme sahiptir, zira testler, yeniden d\u00fczenleme s\u0131ras\u0131nda herhangi bir i\u015flevselli\u011fin bozulmad\u0131\u011f\u0131n\u0131n g\u00fcvencesidir.<\/li>\n<\/ol>\n<p>Bu d\u00f6ng\u00fc s\u00fcrekli tekrarland\u0131k\u00e7a, ortaya \u00e7\u0131kan kodun daha temiz, daha anla\u015f\u0131l\u0131r, daha az bug i\u00e7eren ve daha esnek oldu\u011fu g\u00f6r\u00fcl\u00fcr. TDD, ayn\u0131 zamanda geli\u015ftiricilerin tasar\u0131mlar\u0131n\u0131 iyile\u015ftirmelerine ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 azaltmalar\u0131na yard\u0131mc\u0131 olan bir tasar\u0131m arac\u0131 olarak da i\u015flev g\u00f6r\u00fcr. Yaz\u0131lan her test, asl\u0131nda birer spesifikasyon g\u00f6revi g\u00f6r\u00fcr ve kodun &#8220;belgesini&#8221; olu\u015fturur. B\u00f6ylece, projenin b\u00fcy\u00fckl\u00fc\u011f\u00fc ne olursa olsun, yeni \u00f6zellikler eklendi\u011finde veya mevcut kodda de\u011fi\u015fiklikler yap\u0131ld\u0131\u011f\u0131nda, testler bize bir g\u00fcvenlik a\u011f\u0131 sunar.<\/p>\n<h3>Kabul Testleri (Acceptance Tests) Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Kabul testleri, yaz\u0131l\u0131m\u0131n belirli i\u015f gereksinimlerini veya kullan\u0131c\u0131 hikayelerini kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in tasarlanm\u0131\u015f \u00fcst d\u00fczey testlerdir. Bu testler, genellikle m\u00fc\u015fteri veya \u00fcr\u00fcn sahibi taraf\u0131ndan tan\u0131mlanan beklentilere dayan\u0131r ve sistemin &#8220;do\u011fru \u015feyi yap\u0131p yapmad\u0131\u011f\u0131n\u0131&#8221; kontrol eder. Birim testleri bir metodun veya s\u0131n\u0131f\u0131n tek bir k\u00fc\u00e7\u00fck par\u00e7as\u0131n\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamaya odaklan\u0131rken, entegrasyon testleri farkl\u0131 mod\u00fcllerin birbiriyle uyumlu \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol ederken, kabul testleri t\u00fcm sistemin son kullan\u0131c\u0131 perspektifinden beklenen i\u015flevi yerine getirip getirmedi\u011fini do\u011frular.<\/p>\n<p>\u00d6rne\u011fin, bir Umbraco projesinde &#8220;Kullan\u0131c\u0131 yeni bir blog yaz\u0131s\u0131 olu\u015fturabilmeli ve yay\u0131mlayabilmeli&#8221; \u015feklinde bir i\u015f gereksinimi varsa, kabul testi bu senaryoyu ba\u015ftan sona sim\u00fcle eder. Bu, bir kullan\u0131c\u0131n\u0131n Umbraco back-office&#8217;ine giri\u015f yapmas\u0131, yeni bir i\u00e7erik d\u00fc\u011f\u00fcm\u00fc olu\u015fturmas\u0131, gerekli alanlar\u0131 doldurmas\u0131 ve yay\u0131mlamas\u0131 gibi ad\u0131mlar\u0131 i\u00e7erebilir. Otomatik kabul testleri sayesinde, bu t\u00fcr senaryolar s\u00fcrekli olarak kontrol edilebilir, b\u00f6ylece yeni bir kod de\u011fi\u015fikli\u011finin mevcut i\u015flevselli\u011fi bozup bozmad\u0131\u011f\u0131 h\u0131zl\u0131ca tespit edilebilir. Bu testler, geli\u015ftirici ve i\u015f birimi aras\u0131ndaki ileti\u015fimi g\u00fc\u00e7lendirir, beklenti farkl\u0131l\u0131klar\u0131n\u0131 giderir ve nihayetinde daha memnun edici bir \u00fcr\u00fcn ortaya \u00e7\u0131kmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Umbraco Y\u00f6netim API&#8217;si (Management API) Bize Ne Sunuyor?<\/h3>\n<p>Umbraco Y\u00f6netim API&#8217;si, Umbraco 9 ve sonraki s\u00fcr\u00fcmlerinde sunulan, Umbraco back-office i\u015flevselli\u011fine programatik olarak eri\u015fim sa\u011flayan g\u00fc\u00e7l\u00fc bir RESTful API&#8217;dir. Bu API, geli\u015ftiricilere i\u00e7erik d\u00fc\u011f\u00fcmleri olu\u015fturma, g\u00fcncelleme, silme, medya \u00f6\u011feleri y\u00f6netimi, belge t\u00fcrleri \u00fczerinde i\u015flem yapma ve hatta kullan\u0131c\u0131lar\u0131 ve izinleri y\u00f6netme gibi bir dizi i\u015flemi HTTP istekleri arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirme imkan\u0131 sunar. Temelde, Umbraco back-office&#8217;inde bir edit\u00f6r\u00fcn yapabilece\u011fi hemen hemen her \u015feyi kod arac\u0131l\u0131\u011f\u0131yla yapabilece\u011finiz anlam\u0131na gelir.<\/p>\n<p>Bu API&#8217;nin varl\u0131\u011f\u0131, kabul testleri yazarken bize muazzam bir esneklik ve g\u00fc\u00e7 katar. Art\u0131k test senaryolar\u0131m\u0131z\u0131, sanal bir taray\u0131c\u0131 otomasyonuna ihtiya\u00e7 duymadan do\u011frudan Umbraco&#8217;nun kalbiyle etkile\u015fime ge\u00e7erek olu\u015fturabiliriz. \u00d6rne\u011fin, yeni bir i\u00e7erik t\u00fcr\u00fc alt\u0131nda otomatik olarak bir i\u00e7erik d\u00fc\u011f\u00fcm\u00fc olu\u015fturup, ilgili alanlar\u0131 doldurup, hatta bir medya \u00f6\u011fesi y\u00fckleyip bunu i\u00e7erik d\u00fc\u011f\u00fcm\u00fcne ba\u011flayabilir ve ard\u0131ndan bu d\u00fc\u011f\u00fcm\u00fcn ba\u015far\u0131yla yay\u0131mland\u0131\u011f\u0131n\u0131 do\u011frulayabiliriz. T\u00fcm bunlar, HTTP \u00e7a\u011fr\u0131lar\u0131 ve JSON veri al\u0131\u015fveri\u015fi \u00fczerinden ger\u00e7ekle\u015fir. API, standart kimlik do\u011frulama mekanizmalar\u0131n\u0131 (\u00f6rn. JWT tabanl\u0131 OAuth) destekler, bu da g\u00fcvenli bir \u015fekilde etkile\u015fim kurman\u0131z\u0131 sa\u011flar. Bu API sayesinde, Umbraco projeleriniz i\u00e7in yazd\u0131\u011f\u0131n\u0131z \u00f6zel i\u015f mant\u0131klar\u0131n\u0131n veya entegrasyonlar\u0131n, Umbraco&#8217;nun \u00e7ekirdek y\u00f6netim i\u015flevleriyle uyumlu ve hatas\u0131z \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00fcvence alt\u0131na alan kapsaml\u0131 testler olu\u015fturabiliriz.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Umbraco Y\u00f6netim API&#8217;si, CI\/CD ortamlar\u0131nda otomatik testler i\u00e7in paha bi\u00e7ilmezdir. Test ortam\u0131nda h\u0131zl\u0131ca veri haz\u0131rlayabilir, senaryolar\u0131 \u00e7al\u0131\u015ft\u0131rabilir ve test sonras\u0131 ortam\u0131 temizleyebilirsiniz. Bu, geli\u015ftirme d\u00f6ng\u00fcn\u00fcz\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r ve hatalar\u0131 erken a\u015famada yakalaman\u0131z\u0131 sa\u011flar.\n    <\/div>\n<h2>TDD ile Umbraco Y\u00f6netim API&#8217;sini Kullanarak Kabul Testleri Nas\u0131l Yaz\u0131l\u0131r?<\/h2>\n<p>\u015eimdi teoriden prati\u011fe ge\u00e7me zaman\u0131! Bu b\u00f6l\u00fcmde, TDD&#8217;nin Red-Green-Refactor d\u00f6ng\u00fcs\u00fcn\u00fc takip ederek Umbraco Y\u00f6netim API&#8217;si ile nas\u0131l kabul testi yazaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Senaryo olarak, Umbraco&#8217;da yeni bir &#8220;Blog Yaz\u0131s\u0131&#8221; i\u00e7erik d\u00fc\u011f\u00fcm\u00fc olu\u015fturma i\u015flemini ele alaca\u011f\u0131z. Bu, Umbraco tabanl\u0131 projelerde en s\u0131k kar\u015f\u0131la\u015f\u0131lan y\u00f6netim g\u00f6revlerinden biridir.<\/p>\n<h3>Ortam Kurulumu ve Gerekli Ara\u00e7lar: Ba\u015flamak \u0130\u00e7in Ne Laz\u0131m?<\/h3>\n<p>Ba\u015flamadan \u00f6nce, test ortam\u0131m\u0131z\u0131 haz\u0131rlamam\u0131z gerekiyor. \u0130\u015fte ihtiyac\u0131n\u0131z olacaklar:<\/p>\n<ul>\n<li><b>.NET SDK:<\/b> Umbraco ve test projeniz i\u00e7in uyumlu bir .NET SDK (tercihen .NET 7 veya 8).<\/li>\n<li><b>Umbraco Projesi:<\/b> Y\u00f6netim API&#8217;sinin etkin oldu\u011fu \u00e7al\u0131\u015fan bir Umbraco 9+ projesi. Bu projenin bir veritaban\u0131 ba\u011flant\u0131s\u0131 olmal\u0131 ve back-office&#8217;e eri\u015febiliyor olmal\u0131s\u0131n\u0131z. Ayr\u0131ca, Umbraco&#8217;da API anahtar\u0131 veya bir API kullan\u0131c\u0131s\u0131 olu\u015fturarak kimlik do\u011frulama i\u00e7in gerekli \u00f6nlemleri almal\u0131s\u0131n\u0131z.<\/li>\n<li><b>Test \u00c7er\u00e7evesi:<\/b> xUnit veya NUnit gibi pop\u00fcler bir .NET test \u00e7er\u00e7evesi. Bu makalede xUnit kullanaca\u011f\u0131z.<\/li>\n<li><b>Assertion K\u00fct\u00fcphanesi:<\/b> FluentAssertions, testlerinizi daha okunur hale getirmek i\u00e7in harika bir se\u00e7imdir.<\/li>\n<li><b>HTTP \u0130stemcisi:<\/b> .NET&#8217;in yerle\u015fik <code>HttpClient<\/code> s\u0131n\u0131f\u0131, API \u00e7a\u011fr\u0131lar\u0131 i\u00e7in yeterlidir.<\/li>\n<li><b>JSON Serile\u015ftirme\/Deserile\u015ftirme:<\/b> <code>System.Text.Json<\/code> (varsay\u0131lan) veya Newtonsoft.Json.<\/li>\n<\/ul>\n<p>Test projemizi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">\ndotnet new xunit -n UmbracoAcceptanceTests\ncd UmbracoAcceptanceTests\ndotnet add package FluentAssertions\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, test projenize Umbraco API'sine eri\u015fmek i\u00e7in gerekli konfig\u00fcrasyonlar\u0131 eklemeniz gerekecektir. Bu genellikle bir <code>appsettings.json<\/code> dosyas\u0131 olu\u015fturarak ve Umbraco API URL'si, API anahtar\u0131 veya kullan\u0131c\u0131 kimlik bilgileri gibi ayarlar\u0131 buraya ekleyerek yap\u0131l\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-json\">\n{\n  \"UmbracoApi\": {\n    \"BaseUrl\": \"https:\/\/localhost:44380\/\", \/\/ Kendi Umbraco URL'niz\n    \"ApiKey\": \"S\u00fcperG\u00fcvenliAnahtar\u0131n\u0131z\" \/\/ Umbraco back-office'ten al\u0131nan API anahtar\u0131\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu konfig\u00fcrasyonu test projenize y\u00fcklemek i\u00e7in <code>Microsoft.Extensions.Configuration<\/code> paketlerini kullanabilirsiniz.<\/p>\n<h3>\u0130lk Testimizi Yazma (RED A\u015famas\u0131): Hen\u00fcz Var Olmayan Bir \u00d6zelli\u011fi Test Etmek<\/h3>\n<p>TDD'nin ilk ad\u0131m\u0131, ba\u015far\u0131s\u0131z olacak bir test yazmakt\u0131r. Amac\u0131m\u0131z, yeni bir \"Blog Yaz\u0131s\u0131\" olu\u015fturmak. Umbraco'da bu i\u00e7erik t\u00fcr\u00fcn\u00fcn mevcut oldu\u011funu varsayal\u0131m. \u0130lk testimiz, bu i\u015flemi ger\u00e7ekle\u015ftirecek bir metodun hen\u00fcz var olmad\u0131\u011f\u0131n\u0131 ve bu nedenle ba\u015far\u0131s\u0131z olaca\u011f\u0131n\u0131 g\u00f6sterecek:<\/p>\n<pre><code class=\"language-csharp\">\nusing Xunit;\nusing FluentAssertions;\nusing System.Threading.Tasks;\n\nnamespace UmbracoAcceptanceTests\n{\n    public class ContentManagementTests\n    {\n        [Fact]\n        public async Task YeniBlogYazisiOlusturma_BasariliOlmal\u0131()\n        {\n            \/\/ Arrange: Hen\u00fcz bir API istemcisi veya metodumuz yok.\n            \/\/ Bu k\u0131s\u0131m daha sonra doldurulacak.\n\n            \/\/ Act: Hen\u00fcz mevcut olmayan bir metodu \u00e7a\u011f\u0131rma denemesi (sim\u00fcle edelim)\n            \/\/ Guid? contentId = await _umbracoApiService.CreateBlogEntry(\"\u0130lk Blog Yaz\u0131m\", Guid.Parse(\"parentId\"), \"blogPost\");\n\n            \/\/ Assert: Testin ba\u015far\u0131s\u0131z olmas\u0131n\u0131 bekliyoruz, \u00e7\u00fcnk\u00fc hen\u00fcz i\u015flevsellik yok.\n            \/\/ \u00d6rne\u011fin, \"Assert.True(false)\" ile bilin\u00e7li bir hata f\u0131rlatabiliriz.\n            Assert.True(false, \"Test hen\u00fcz implemente edilmedi ve ba\u015far\u0131s\u0131z olmal\u0131.\");\n\n            \/\/ contentId.Should().NotBeNull(); \/\/ Bu da sonra gelecek\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu testi \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, bekledi\u011finiz gibi ba\u015far\u0131s\u0131z olacakt\u0131r. Bu \"k\u0131rm\u0131z\u0131\" durum, bize ne geli\u015ftirmemiz gerekti\u011fini a\u00e7\u0131k\u00e7a g\u00f6sterir: Umbraco API'si \u00fczerinden bir blog yaz\u0131s\u0131 olu\u015fturacak bir mekanizma.<\/p>\n<h3>API \u0130stemcisini Geli\u015ftirme (GREEN A\u015famas\u0131): Testi Ge\u00e7irmek \u0130\u00e7in Minimum Kod<\/h3>\n<p>\u015eimdi \"k\u0131rm\u0131z\u0131\" testi \"ye\u015file\" \u00e7evirmek i\u00e7in gerekli minimum kodu yazal\u0131m. Umbraco API'si ile etkile\u015fime ge\u00e7ecek bir servis s\u0131n\u0131f\u0131 olu\u015fturaca\u011f\u0131z. Bu servis, HTTP istemcisini kullanarak i\u00e7erik d\u00fc\u011f\u00fcm\u00fc olu\u015fturma iste\u011fi g\u00f6nderecek.<\/p>\n<p>\u0130lk olarak, Umbraco API'sinden yan\u0131t d\u00f6necek basit bir model tan\u0131mlayal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\npublic class ContentCreateResponse\n{\n    public Guid Id { get; set; }\n    \/\/ Di\u011fer gerekli property'ler (\u00f6rne\u011fin Udi, Name) eklenebilir\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, UmbracoApiService s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\nusing System.Net.Http;\nusing System.Net.Http.Json;\nusing System.Threading.Tasks;\nusing System;\nusing System.Collections.Generic;\n\nnamespace UmbracoAcceptanceTests\n{\n    public class UmbracoApiService\n    {\n        private readonly HttpClient _httpClient;\n        private readonly string _apiKey;\n\n        public UmbracoApiService(HttpClient httpClient, string umbracoApiKey)\n        {\n            _httpClient = httpClient;\n            _apiKey = umbracoApiKey;\n            _httpClient.DefaultRequestHeaders.Add(\"Umb-Api-Key\", _apiKey); \/\/ API anahtar\u0131n\u0131 ekle\n            _httpClient.BaseAddress = new Uri(\"https:\/\/localhost:44380\/\"); \/\/ Kendi Umbraco URL'niz\n        }\n\n        public async Task<Guid?> CreateContentNode(string name, Guid parentId, string contentTypeAlias)\n        {\n            var requestBody = new\n            {\n                name = name,\n                parentId = parentId,\n                contentTypeAlias = contentTypeAlias,\n                invariant = new {\n                    \/\/ \u0130\u00e7erik d\u00fc\u011f\u00fcm\u00fcne \u00f6zel alanlar\u0131 buraya ekleyebilirsiniz.\n                    \/\/ \u00d6rne\u011fin, bir blog yaz\u0131s\u0131 i\u00e7in \"title\" ve \"body\" alanlar\u0131.\n                    \/\/ Bu \u00f6rnekte sadece temel olu\u015fturma i\u015flemini g\u00f6steriyoruz.\n                }\n            };\n\n            \/\/ Umbraco Management API'sinin i\u00e7erik olu\u015fturma endpoint'i\n            var response = await _httpClient.PostAsJsonAsync(\"umbraco\/management\/api\/v1\/content\", requestBody);\n\n            response.EnsureSuccessStatusCode(); \/\/ HTTP 200-299 aral\u0131\u011f\u0131nda olmayan bir yan\u0131t gelirse exception f\u0131rlat\u0131r\n\n            var contentResponse = await response.Content.ReadFromJsonAsync<ContentCreateResponse>();\n            return contentResponse?.Id;\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi test metodumuzu g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-csharp\">\nusing Xunit;\nusing FluentAssertions;\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Configuration; \/\/ Konfig\u00fcrasyonu okumak i\u00e7in\n\nnamespace UmbracoAcceptanceTests\n{\n    public class ContentManagementTests\n    {\n        private readonly UmbracoApiService _umbracoApiService;\n        private readonly Guid _parentBlogFolderId; \/\/ Blog yaz\u0131lar\u0131n\u0131n olu\u015fturulaca\u011f\u0131 klas\u00f6r\u00fcn ID'si\n        \n        public ContentManagementTests()\n        {\n            \/\/ Konfig\u00fcrasyonu y\u00fckle\n            var configuration = new ConfigurationBuilder()\n                .AddJsonFile(\"appsettings.json\")\n                .Build();\n\n            var umbracoApiSettings = configuration.GetSection(\"UmbracoApi\");\n            var baseUrl = umbracoApiSettings[\"BaseUrl\"];\n            var apiKey = umbracoApiSettings[\"ApiKey\"];\n\n            var httpClient = new HttpClient { BaseAddress = new Uri(baseUrl) };\n            _umbracoApiService = new UmbracoApiService(httpClient, apiKey);\n\n            \/\/ Umbraco'da \u00f6nceden tan\u0131mlanm\u0131\u015f bir \"Blog Klas\u00f6r\u00fc\" i\u00e7eri\u011finin ID'si\n            \/\/ Bu ID'yi Umbraco back-office'ten veya ba\u015fka bir API \u00e7a\u011fr\u0131s\u0131yla alabilirsiniz.\n            _parentBlogFolderId = Guid.Parse(\"S\u0130Z\u0130N_BLOG_KLAS\u00d6R\u00dc_GUID_ID'N\u0130Z\"); \n        }\n\n        [Fact]\n        public async Task YeniBlogYazisiOlusturma_BasariliOlmal\u0131()\n        {\n            \/\/ Arrange\n            string blogPostName = $\"Test Blog Yaz\u0131s\u0131 {Guid.NewGuid()}\";\n            string contentTypeAlias = \"blogPost\"; \/\/ Umbraco'daki i\u00e7erik t\u00fcr\u00fc alias'\u0131n\u0131z\n\n            \/\/ Act\n            Guid? contentId = await _umbracoApiService.CreateContentNode(blogPostName, _parentBlogFolderId, contentTypeAlias);\n\n            \/\/ Assert\n            contentId.Should().NotBeNull(\"\u00c7\u00fcnk\u00fc yeni bir blog yaz\u0131s\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde olu\u015fturulmal\u0131.\");\n            contentId.Should().NotBe(Guid.Empty, \"Olu\u015fturulan i\u00e7erik ID'si bo\u015f Guid olmamal\u0131.\");\n\n            \/\/ Opsiyonel: Olu\u015fturulan i\u00e7eri\u011fi silme veya daha fazla do\u011frulama ad\u0131mlar\u0131\n            \/\/ \u00d6rne\u011fin: await _umbracoApiService.DeleteContentNode(contentId.Value);\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu testi \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, API \u00e7a\u011fr\u0131s\u0131 ba\u015far\u0131l\u0131 olursa testiniz ye\u015fil olacakt\u0131r. Tebrikler, TDD d\u00f6ng\u00fcs\u00fcn\u00fcn ilk RED-GREEN a\u015famas\u0131n\u0131 tamamlad\u0131n\u0131z!<\/p>\n<h3>Testi \u0130yile\u015ftirme (REFACTOR A\u015famas\u0131): Daha Okunabilir ve Bak\u0131m\u0131 Kolay Kod<\/h3>\n<p>Testimiz \u00e7al\u0131\u015f\u0131yor, ancak daha iyi hale getirebiliriz. Refactor a\u015famas\u0131nda odaklanaca\u011f\u0131m\u0131z noktalar:<\/p>\n<ul>\n<li><b>Daha Okunabilir Assertions:<\/b> FluentAssertions k\u00fct\u00fcphanesi ile daha ak\u0131c\u0131 ve anlaml\u0131 do\u011frulama ifadeleri yazabiliriz.<\/li>\n<li><b>Test Verileri Y\u00f6netimi:<\/b> Testlerin birbirini etkilememesi ve tekrarlanabilir olmas\u0131 i\u00e7in test verilerini nas\u0131l y\u00f6netece\u011fimiz.<\/li>\n<li><b>Yard\u0131mc\u0131 Metotlar:<\/b> Tekrarlayan kodlar\u0131 yard\u0131mc\u0131 metotlara veya bir test fixture'a ta\u015f\u0131mak.<\/li>\n<\/ul>\n<p>Yukar\u0131daki kod zaten FluentAssertions kullan\u0131yor ve olduk\u00e7a okunabilir durumda. Test verileri y\u00f6netimi i\u00e7in, her testten sonra olu\u015fturulan i\u00e7eri\u011fi temizlemek iyi bir pratik olabilir. Bunun i\u00e7in <code>UmbracoApiService<\/code> s\u0131n\u0131f\u0131na bir silme metodu ekleyebiliriz:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ UmbracoApiService s\u0131n\u0131f\u0131na eklenecek metot\npublic async Task<bool> DeleteContentNode(Guid contentId)\n{\n    var response = await _httpClient.DeleteAsync($\"umbraco\/management\/api\/v1\/content\/{contentId}\");\n    return response.IsSuccessStatusCode;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Ve test metodumuzda bunu kullanal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ ContentManagementTests s\u0131n\u0131f\u0131nda, test metodunun sonunda veya bir IDisposable implementasyonunda\n\/\/ [Fact] metodunun i\u00e7inde kullanabiliriz. XUnit'te IDisposable daha temiz bir yol sunar.\n\npublic class ContentManagementTests : IDisposable\n{\n    \/\/ ... (\u00f6nceki kodlar)\n    private readonly List<Guid> _createdContentIds = new List<Guid>();\n\n    public async Task YeniBlogYazisiOlusturma_BasariliOlmal\u0131()\n    {\n        \/\/ ... (Act a\u015famas\u0131)\n        Guid? contentId = await _umbracoApiService.CreateContentNode(blogPostName, _parentBlogFolderId, contentTypeAlias);\n        contentId.Should().NotBeNull();\n        _createdContentIds.Add(contentId.Value); \/\/ Olu\u015fturulan ID'yi listeye ekle\n\n        \/\/ ... (Assert a\u015famas\u0131)\n    }\n\n    \/\/ IDisposable aray\u00fcz\u00fcn\u00fcn Dispose metodunu implemente ederek test sonras\u0131 temizlik yapal\u0131m\n    public void Dispose()\n    {\n        foreach (var id in _createdContentIds)\n        {\n            _umbracoApiService.DeleteContentNode(id).GetAwaiter().GetResult(); \/\/ Senkron \u00e7a\u011fr\u0131 i\u00e7in GetResult kullan\u0131ld\u0131\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, her testin kendi olu\u015fturdu\u011fu veriyi temizlemesini sa\u011flayarak testlerin izole ve tekrarlanabilir olmas\u0131n\u0131 garanti eder. Bu, TDD'nin Refactor a\u015famas\u0131nda kodun de\u011fil, test altyap\u0131s\u0131n\u0131n iyile\u015ftirilmesine bir \u00f6rnektir.<\/p>\n<h3>Medya Y\u00fckleme Senaryosu (Vaka Analizi): Daha Karma\u015f\u0131k Bir API Etkile\u015fimi<\/h3>\n<p>Umbraco'da i\u00e7erik olu\u015fturmak kadar yayg\u0131n bir di\u011fer senaryo da medya y\u00fcklemektir. Umbraco Y\u00f6netim API'si \u00fczerinden bir g\u00f6rseli nas\u0131l y\u00fckleyece\u011fimize dair bir \u00f6rnekle daha karma\u015f\u0131k bir API etkile\u015fimini g\u00f6relim. Bu senaryo, <code>MultipartFormDataContent<\/code> kullan\u0131m\u0131 gerektirir.<\/p>\n<p>\u00d6nce <code>UmbracoApiService<\/code> s\u0131n\u0131f\u0131m\u0131za medya y\u00fckleme metodunu ekleyelim:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ UmbracoApiService s\u0131n\u0131f\u0131na eklenecek metot\npublic async Task<Guid?> UploadMedia(string fileName, byte[] fileBytes, Guid parentId, string contentTypeAlias = \"Image\")\n{\n    using var formData = new MultipartFormDataContent();\n    var fileContent = new ByteArrayContent(fileBytes);\n    fileContent.Headers.Add(\"Content-Type\", \"image\/jpeg\"); \/\/ Veya uygun mime tipi\n\n    formData.Add(fileContent, \"file\", fileName);\n    formData.Add(new StringContent(parentId.ToString()), \"parentId\");\n    formData.Add(new StringContent(contentTypeAlias), \"contentTypeAlias\");\n\n    \/\/ Umbraco Management API'sinin medya y\u00fckleme endpoint'i\n    var response = await _httpClient.PostAsync(\"umbraco\/management\/api\/v1\/media\/file\", formData);\n    \n    response.EnsureSuccessStatusCode();\n\n    var mediaResponse = await response.Content.ReadFromJsonAsync<ContentCreateResponse>(); \/\/ Ayn\u0131 response modelini kullanabiliriz\n    return mediaResponse?.Id;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi de bu metodu test edecek bir kabul testi yazal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\nusing Xunit;\nusing FluentAssertions;\nusing System;\nusing System.IO;\nusing System.Threading.Tasks;\n\n\/\/ ... (Di\u011fer using'ler ve s\u0131n\u0131f tan\u0131m\u0131)\n\npublic class ContentManagementTests : IDisposable\n{\n    \/\/ ... (\u00d6nceki tan\u0131mlamalar)\n    private readonly List<Guid> _createdMediaIds = new List<Guid>();\n    private readonly Guid _parentMediaFolderId = Guid.Parse(\"S\u0130Z\u0130N_MEDYA_KLAS\u00d6R\u00dc_GUID_ID'N\u0130Z\"); \/\/ Medya klas\u00f6r\u00fcn\u00fcn ID'si\n\n    [Fact]\n    public async Task YeniMedyaYukleme_BasariliOlmal\u0131()\n    {\n        \/\/ Arrange\n        string fileName = $\"test-gorsel-{Guid.NewGuid()}.jpg\";\n        \/\/ Ger\u00e7ek bir resim dosyas\u0131 i\u00e7eri\u011fi (\u00f6rne\u011fin, 1x1 piksel bo\u015f bir JPEG)\n        \/\/ Ya da test i\u00e7in basit bir byte dizisi olu\u015fturabiliriz.\n        byte[] fileBytes = await File.ReadAllBytesAsync(\"test-image.jpg\"); \/\/ Projenize k\u00fc\u00e7\u00fck bir test resmi ekleyin\n\n        \/\/ Act\n        Guid? mediaId = await _umbracoApiService.UploadMedia(fileName, fileBytes, _parentMediaFolderId);\n\n        \/\/ Assert\n        mediaId.Should().NotBeNull(\"\u00c7\u00fcnk\u00fc yeni bir medya \u00f6\u011fesi ba\u015far\u0131l\u0131 bir \u015fekilde y\u00fcklenmeli.\");\n        _createdMediaIds.Add(mediaId.Value);\n\n        \/\/ Opsiyonel: Y\u00fcklenen medyan\u0131n URL'sini veya di\u011fer \u00f6zelliklerini kontrol etmek\n        \/\/ Bunun i\u00e7in Umbraco API'sinin medya alma endpoint'ini kullanmak gerekir.\n    }\n\n    \/\/ Dispose metodunu g\u00fcncelle\n    public void Dispose()\n    {\n        foreach (var id in _createdContentIds)\n        {\n            _umbracoApiService.DeleteContentNode(id).GetAwaiter().GetResult();\n        }\n        foreach (var id in _createdMediaIds)\n        {\n            _umbracoApiService.DeleteContentNode(id).GetAwaiter().GetResult(); \/\/ Medya i\u00e7in de ayn\u0131 silme endpoint'i kullan\u0131labilir\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizi, Umbraco Y\u00f6netim API'sinin farkl\u0131 endpoint'leriyle nas\u0131l etkile\u015fime ge\u00e7ilece\u011fini ve TDD prensiplerini daha karma\u015f\u0131k senaryolara nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 g\u00f6stermektedir. Her test, ba\u011f\u0131ms\u0131z ve tekrarlanabilir olmal\u0131, ve her test kendi ortam\u0131n\u0131 haz\u0131rlay\u0131p kendi yaratt\u0131\u011f\u0131 veriyi temizlemelidir. Bu, sa\u011flam ve g\u00fcvenilir bir kabul testi altyap\u0131s\u0131 olu\u015fturman\u0131n anahtar\u0131d\u0131r.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: Testlerde kullan\u0131lan dosya i\u00e7erikleri i\u00e7in ger\u00e7ek dosyalar yerine k\u00fc\u00e7\u00fck boyutlu, bilinen i\u00e7erikte (\u00f6rne\u011fin 1x1 piksel bo\u015f bir resim) test dosyalar\u0131 olu\u015fturabilirsiniz. Bu, testlerin daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 ve disk I\/O'dan kaynaklanan potansiyel hatalar\u0131 azaltmas\u0131n\u0131 sa\u011flar.\n    <\/div>\n<h2>\u0130leri D\u00fczey TDD Pratikleri ve Optimizasyonlar<\/h2>\n<p>Temel kabul testleri yazmay\u0131 \u00f6\u011frendik, \u015fimdi bu bilgileri bir ad\u0131m \u00f6teye ta\u015f\u0131yarak daha g\u00fc\u00e7l\u00fc, esnek ve verimli test stratejileri geli\u015ftirelim. Deneyimli geli\u015ftiriciler i\u00e7in kabul testlerini daha da optimize edecek ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131 bu b\u00f6l\u00fcmde yer al\u0131yor.<\/p>\n<h3>Test Verisi Y\u00f6netimi: Ortam\u0131 Kirletmeden Test Etmek<\/h3>\n<p>Otomatik kabul testlerinin en b\u00fcy\u00fck zorluklar\u0131ndan biri, test ortam\u0131ndaki verileri y\u00f6netmektir. Her testin birbirinden ba\u011f\u0131ms\u0131z olmas\u0131 ve bir \u00f6nceki testin b\u0131rakt\u0131\u011f\u0131 veriden etkilenmemesi gerekir. Yukar\u0131daki <code>IDisposable<\/code> \u00f6rne\u011fimiz bir ba\u015flang\u0131\u00e7t\u0131r, ancak daha geli\u015fmi\u015f stratejiler de mevcuttur:<\/p>\n<ul>\n<li><b>Test Veritaban\u0131 Resetleme:<\/b> Her test s\u00fciti veya her test \u00e7al\u0131\u015fmas\u0131 ba\u015flamadan \u00f6nce Umbraco veritaban\u0131n\u0131n belirli bir \"temiz\" duruma getirilmesi. Bu genellikle bir veritaban\u0131 yede\u011finin geri y\u00fcklenmesi veya t\u00fcm tablolar\u0131n bo\u015falt\u0131l\u0131p seed verilerinin yeniden eklenmesiyle yap\u0131l\u0131r. Bu y\u00f6ntem daha yava\u015f olabilir ancak en g\u00fcvenilir temizlik sa\u011flar.<\/li>\n<li><b>API Destekli Temizleme:<\/b> Umbraco Y\u00f6netim API'si \u00fczerinden olu\u015fturulan i\u00e7eri\u011fi veya medyay\u0131 test bittikten sonra silmek. Yukar\u0131daki <code>Dispose<\/code> metodumuz bu stratejinin bir \u00f6rne\u011fidir. T\u00fcm API i\u015flemlerini kapsayan bir temizlik mekanizmas\u0131 kurmak \u00f6nemlidir.<\/li>\n<li><b>Test Ortam\u0131 \u0130zolasyonu:<\/b> Her testin kendi Umbraco \u00f6rne\u011fi (\u00f6rne\u011fin Docker konteynerleri kullanarak) \u00fczerinde \u00e7al\u0131\u015fmas\u0131. Bu, en y\u00fcksek izolasyonu sa\u011flar ancak kaynak t\u00fcketimi ve kurulum karma\u015f\u0131kl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan maliyetli olabilir.<\/li>\n<\/ul>\n<p>Se\u00e7ilen strateji, projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne, b\u00fct\u00e7esine ve testlerin \u00e7al\u0131\u015fma s\u0131kl\u0131\u011f\u0131na g\u00f6re de\u011fi\u015febilir. \u00d6nemli olan, testlerin deterministik olmas\u0131n\u0131 sa\u011flamakt\u0131r; yani her \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda ayn\u0131 sonucu vermesi.<\/p>\n<h3>Performans Optimizasyonu: H\u0131zl\u0131 Geri Bildirim D\u00f6ng\u00fcleri<\/h3>\n<p>Kabul testleri genellikle birim testlerinden daha yava\u015f \u00e7al\u0131\u015f\u0131r \u00e7\u00fcnk\u00fc ger\u00e7ek bir sistemle (Umbraco ve veritaban\u0131) etkile\u015fime girerler. Ancak TDD'nin temel prensiplerinden biri h\u0131zl\u0131 geri bildirimdir. Bu nedenle kabul testlerinin performans\u0131n\u0131 optimize etmek kritik \u00f6neme sahiptir:<\/p>\n<ul>\n<li><b>Paralel Test \u00c7al\u0131\u015ft\u0131rma:<\/b> Test \u00e7er\u00e7evelerinin (xUnit, NUnit) paralel test \u00e7al\u0131\u015ft\u0131rma \u00f6zelliklerini kullanarak testleri e\u015f zamanl\u0131 \u00e7al\u0131\u015ft\u0131rmak. Bu, test s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltabilir. Ancak, testler aras\u0131nda veri \u00e7ak\u0131\u015fmalar\u0131 olmamas\u0131 i\u00e7in dikkatli olunmal\u0131d\u0131r.<\/li>\n<li><b>Gereksiz API \u00c7a\u011fr\u0131lar\u0131ndan Ka\u00e7\u0131nma:<\/b> E\u011fer bir test sadece bir i\u00e7eri\u011fin varl\u0131\u011f\u0131n\u0131 kontrol ediyorsa, i\u00e7eri\u011fi yeniden olu\u015fturmak yerine var olan bir statik i\u00e7eri\u011fi kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz (temizlik sonras\u0131 geri y\u00fckleme yap\u0131l\u0131yorsa). Ancak bu, test izolasyonunu bozabilir, dikkatli dengelemek gerekir.<\/li>\n<li><b>\u00d6ny\u00fckleme (Bootstrap) Optimizasyonu:<\/b> Umbraco uygulamas\u0131n\u0131n testler ba\u015flamadan \u00f6nce sadece bir kez ba\u015flat\u0131lmas\u0131 ve testler aras\u0131nda yeniden ba\u015flat\u0131lmamas\u0131. Bu, \u00f6zellikle CI\/CD ortamlar\u0131nda test s\u00fcresini k\u0131salt\u0131r.<\/li>\n<\/ul>\n<h3>G\u00fcvenlik Testleri: Yetkilendirme ve Kimlik Do\u011frulama Senaryolar\u0131<\/h3>\n<p>Umbraco Y\u00f6netim API'si, i\u00e7erik y\u00f6netiminin kalbinde yer ald\u0131\u011f\u0131ndan, g\u00fcvenlik testleri b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Kabul testleri, kullan\u0131c\u0131lar\u0131n do\u011fru yetkilere sahip olup olmad\u0131\u011f\u0131n\u0131 ve yetkisiz eri\u015fim denemelerinin engellendi\u011fini do\u011frulamak i\u00e7in kullan\u0131labilir:<\/p>\n<ul>\n<li><b>Ba\u015far\u0131s\u0131z Kimlik Do\u011frulama:<\/b> Ge\u00e7ersiz API anahtar\u0131 veya kimlik bilgileriyle yap\u0131lan \u00e7a\u011fr\u0131lar\u0131n 401 Unauthorized hatas\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc test etmek.<\/li>\n<li><b>Yetkilendirme Testleri:<\/b> Belirli bir kullan\u0131c\u0131n\u0131n veya API anahtar\u0131n\u0131n sadece belirli i\u00e7erik t\u00fcrlerini veya y\u00f6netim fonksiyonlar\u0131n\u0131 kullanabildi\u011fini do\u011frulamak. \u00d6rne\u011fin, bir yazar\u0131n \"Ayarlar\" b\u00f6l\u00fcm\u00fcndeki belge t\u00fcrlerini de\u011fi\u015ftirememesi.<\/li>\n<li><b>Veri Eri\u015fimi:<\/b> Bir kullan\u0131c\u0131n\u0131n sadece kendi yetki alan\u0131 i\u00e7indeki verilere eri\u015febildi\u011fini test etmek.<\/li>\n<\/ul>\n<pre><code class=\"language-csharp\">\n[Fact]\npublic async Task GecersizApiKeyIleIcerikOlusturma_YetkilendirmeHatasiVermeli()\n{\n    \/\/ Arrange\n    var httpClient = new HttpClient { BaseAddress = new Uri(\"https:\/\/localhost:44380\/\") };\n    var unauthorizedApiService = new UmbracoApiService(httpClient, \"GecersizAnahtar\");\n\n    \/\/ Act\n    var exception = await Record.ExceptionAsync(() => unauthorizedApiService.CreateContentNode(\"Hatal\u0131 Test\", Guid.NewGuid(), \"blogPost\"));\n\n    \/\/ Assert\n    exception.Should().BeOfType<HttpRequestException>();\n    \/\/ HTTP durum kodu 401 (Unauthorized) veya 403 (Forbidden) oldu\u011funu kontrol et\n    ((HttpRequestException)exception).StatusCode.Should().Be(System.Net.HttpStatusCode.Unauthorized);\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Hata \u0130\u015fleme Testleri: Beklenmeyen Durumlara Haz\u0131rl\u0131k<\/h3>\n<p>Sadece ba\u015far\u0131l\u0131 senaryolar\u0131 test etmek yeterli de\u011fildir. API'nin beklenen hatalara (\u00f6rn. 400 Bad Request, 404 Not Found, 500 Internal Server Error) nas\u0131l yan\u0131t verdi\u011fini de test etmeliyiz. Bu, uygulaman\u0131z\u0131n beklenmedik durumlara kar\u015f\u0131 daha dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<ul>\n<li><b>Ge\u00e7ersiz Giri\u015f Verileri:<\/b> Bir i\u00e7erik d\u00fc\u011f\u00fcm\u00fc olu\u015ftururken zorunlu bir alan\u0131 bo\u015f b\u0131rakmak gibi ge\u00e7ersiz verilerle API'ye istek g\u00f6nderildi\u011finde 400 Bad Request hatas\u0131 d\u00f6nd\u00fcr\u00fcld\u00fc\u011f\u00fcn\u00fc do\u011frulamak.<\/li>\n<li><b>Mevcut Olmayan Kaynak:<\/b> Var olmayan bir i\u00e7erik ID'si ile silme veya g\u00fcncelleme i\u015flemi yap\u0131ld\u0131\u011f\u0131nda 404 Not Found hatas\u0131 d\u00f6nd\u00fcr\u00fcld\u00fc\u011f\u00fcn\u00fc test etmek.<\/li>\n<\/ul>\n<h3>Mobil Uyumlu Testler \u0130\u00e7in \u0130pu\u00e7lar\u0131 (API Yan\u0131t\u0131 Perspektifinden)<\/h3>\n<p>Backend API testleri do\u011frudan mobil uyumlu UI ile ilgili olmasa da, API'nin mobil uygulamalar taraf\u0131ndan nas\u0131l t\u00fcketilece\u011fini d\u00fc\u015f\u00fcnmek \u00f6nemlidir. Mobil cihazlar genellikle daha k\u0131s\u0131tl\u0131 bant geni\u015fli\u011fi ve daha k\u00fc\u00e7\u00fck ekran boyutlar\u0131na sahiptir. Bu nedenle:<\/p>\n<ul>\n<li><b>Yan\u0131t Boyutlar\u0131:<\/b> API yan\u0131tlar\u0131n\u0131n mobil uygulamalar i\u00e7in gereksiz yere b\u00fcy\u00fck olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. A\u015f\u0131r\u0131 veri g\u00f6nderimi mobil cihazlarda performans\u0131 olumsuz etkileyebilir. Test senaryolar\u0131n\u0131zda, API yan\u0131t\u0131n\u0131n belirli bir boyutu a\u015fmad\u0131\u011f\u0131n\u0131 veya yaln\u0131zca gerekli alanlar\u0131 i\u00e7erdi\u011fini do\u011frulayabilirsiniz.<\/li>\n<li><b>Hata Mesajlar\u0131:<\/b> Mobil uygulamalar\u0131n kullan\u0131c\u0131ya dostu hata mesajlar\u0131 g\u00f6sterebilmesi i\u00e7in API'nin anla\u015f\u0131l\u0131r ve yap\u0131land\u0131r\u0131lm\u0131\u015f hata yan\u0131tlar\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc test edin.<\/li>\n<li><b>Kullan\u0131m Kolayl\u0131\u011f\u0131:<\/b> Mobil geli\u015ftiricilerin API'yi kolayca entegre edebilmesi i\u00e7in API tasar\u0131m\u0131n\u0131n ve yan\u0131tlar\u0131n\u0131n tutarl\u0131 ve \u00f6ng\u00f6r\u00fclebilir oldu\u011funu do\u011frulay\u0131n.<\/li>\n<\/ul>\n<p>HTML \u00e7\u0131kt\u0131s\u0131nda do\u011frudan medya sorgular\u0131 sa\u011flamak backend testleriyle ilgili olmasa da, e\u011fer test raporlar\u0131 veya API dok\u00fcmantasyonu web aray\u00fcz\u00fcnde sunuluyorsa, bu durumda responsive tasar\u0131m \u00f6nemlidir:<\/p>\n<pre><code class=\"language-html\">\n<style>\n  \/* Test sonu\u00e7lar\u0131n\u0131n veya API dok\u00fcmantasyonunun mobil cihazlarda daha okunakl\u0131 olmas\u0131 i\u00e7in *\/\n  @media (max-width: 768px) {\n    .api-response-example {\n      font-size: 0.9em;\n      overflow-x: auto; \/* Yatay kayd\u0131rma \u00e7ubu\u011fu *\/\n      white-space: nowrap; \/* Metni tek sat\u0131rda tutma *\/\n    }\n    .test-report-table {\n      display: block;\n      width: 100%;\n      overflow-x: auto;\n      -webkit-overflow-scrolling: touch;\n    }\n    .test-report-table thead, .test-report-table tbody, .test-report-table th, .test-report-table td, .test-report-table tr {\n      display: block;\n    }\n    .test-report-table tr {\n      margin-bottom: 15px;\n      border: 1px solid #ddd;\n    }\n    .test-report-table td {\n      border: none;\n      border-bottom: 1px solid #eee;\n      position: relative;\n      padding-left: 50%;\n      text-align: right;\n    }\n    .test-report-table td::before {\n      content: attr(data-label);\n      position: absolute;\n      left: 6px;\n      width: 45%;\n      padding-right: 10px;\n      white-space: nowrap;\n      text-align: left;\n      font-weight: bold;\n    }\n  }\n<\/style>\n\n<!-- HTML tablosu \u00f6rne\u011fi (test raporu gibi) -->\n<table class=\"test-report-table\">\n  <thead>\n    <tr>\n      <th>Test Ad\u0131<\/th>\n      <th>Durum<\/th>\n      <th>S\u00fcre (ms)<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td data-label=\"Test Ad\u0131\">YeniBlogYazisiOlusturma<\/td>\n      <td data-label=\"Durum\">Ba\u015far\u0131l\u0131<\/td>\n      <td data-label=\"S\u00fcre (ms)\">125<\/td>\n    <\/tr>\n    <tr>\n      <td data-label=\"Test Ad\u0131\">YeniMedyaYukleme<\/td>\n      <td data-label=\"Durum\">Ba\u015far\u0131l\u0131<\/td>\n      <td data-label=\"S\u00fcre (ms)\">210<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ileri d\u00fczey pratikler, Umbraco projelerinizde TDD ve kabul testlerinin potansiyelini tam olarak kullanman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Kod kalitesini art\u0131r\u0131rken, ayn\u0131 zamanda g\u00fcvenli\u011fi, performans\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi de g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h2>Sonu\u00e7: Umbraco Projelerinizde TDD ve Kabul Testlerinin De\u011feri<\/h2>\n<p>Bu makale boyunca, Umbraco'nun y\u00f6netim API'sini kullanarak TDD prensipleriyle kabul testleri yazman\u0131n ne kadar de\u011ferli oldu\u011funu detayl\u0131ca ele ald\u0131k. Geli\u015ftirme s\u00fcrecini testlerin y\u00f6nlendirdi\u011fi TDD yakla\u015f\u0131m\u0131, sadece kod kalitesini art\u0131rmakla kalmaz, ayn\u0131 zamanda i\u015flevselli\u011fin i\u015f gereksinimlerine uygunlu\u011funu da g\u00fcvence alt\u0131na al\u0131r. Kabul testleri, son kullan\u0131c\u0131n\u0131n beklentilerini kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131m\u0131z\u0131 do\u011frulamak i\u00e7in kritik bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcrken, Umbraco Y\u00f6netim API'si bize bu testleri programatik olarak, verimli ve g\u00fcvenilir bir \u015fekilde uygulama g\u00fcc\u00fcn\u00fc sunar.<\/p>\n<p>Red-Green-Refactor d\u00f6ng\u00fcs\u00fcn\u00fc uygulayarak, ilk ba\u015fta ba\u015far\u0131s\u0131z olan bir testle neyi ba\u015farmam\u0131z gerekti\u011fini netle\u015ftirdik, ard\u0131ndan bu testi ge\u00e7irecek minimum kodu yazd\u0131k ve son olarak kodumuzu ve test altyap\u0131m\u0131z\u0131 iyile\u015ftirdik. Medya y\u00fckleme gibi daha karma\u015f\u0131k senaryolarla, Umbraco API'sinin farkl\u0131 yeteneklerini ke\u015ffettik. \u0130leri d\u00fczey pratikler b\u00f6l\u00fcm\u00fcnde ise test verisi y\u00f6netimi, performans optimizasyonu, g\u00fcvenlik ve hata i\u015fleme testleri gibi konulara de\u011finerek, kabul testlerinin kapsam\u0131n\u0131 ve etkinli\u011fini nas\u0131l art\u0131rabilece\u011fimizi g\u00f6sterdik.<\/p>\n<p>Unutmamak gerekir ki, otomatik kabul testleri yazmak ba\u015flang\u0131\u00e7ta ek zaman ve \u00e7aba gerektirse de, uzun vadede projenizin s\u00fcrd\u00fcr\u00fclebilirli\u011fini, hatalara kar\u015f\u0131 direncini ve geli\u015ftirme h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Geli\u015ftiricilerin yeni \u00f6zellikler eklerken veya mevcut kodu refactor ederken daha g\u00fcvende hissetmelerini sa\u011flar, \u00e7\u00fcnk\u00fc herhangi bir hatan\u0131n otomatik testler taraf\u0131ndan h\u0131zla yakalanaca\u011f\u0131n\u0131 bilirler. Bu testler, ayn\u0131 zamanda s\u00fcrekli entegrasyon (CI) ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r ve yaz\u0131l\u0131m\u0131n\u0131z\u0131 her zaman da\u011f\u0131t\u0131ma haz\u0131r halde tutman\u0131za yard\u0131mc\u0131 olur. Umbraco projelerinizde kaliteyi \u00f6n planda tutmak ve daha g\u00fcvenle ilerlemek i\u00e7in bu yakla\u015f\u0131mlar\u0131 benimsemenizi \u015fiddetle tavsiye ederiz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>1. Kabul testleri performans \u00fczerinde olumsuz etki yapar m\u0131?<\/dt>\n<dd>Evet, birim testlerine g\u00f6re kabul testleri genellikle daha yava\u015f \u00e7al\u0131\u015f\u0131r \u00e7\u00fcnk\u00fc ger\u00e7ek bir veritaban\u0131 ve API gibi d\u0131\u015f sistemlerle etkile\u015fime girerler. Ancak bu, TDD ve kabul testlerinden vazge\u00e7mek i\u00e7in bir neden de\u011fildir. Paralel test \u00e7al\u0131\u015ft\u0131rma, test verisi \u00f6nbellekleme ve temiz test ortamlar\u0131 gibi optimizasyon teknikleriyle performans etkisi minimize edilebilir. \u00d6nemli olan, testlerden elde edilen g\u00fcvenin, performans maliyetine de\u011fmesidir.<\/dd>\n<dt>2. Umbraco y\u00f6netim API'sine kimlik do\u011frulama nas\u0131l yap\u0131l\u0131r?<\/dt>\n<dd>Umbraco Y\u00f6netim API'si, genellikle bir API anahtar\u0131 (API Key) veya JWT (JSON Web Token) tabanl\u0131 OAuth 2.0 ak\u0131\u015flar\u0131yla kimlik do\u011frulamas\u0131 yapar. API anahtar\u0131, Umbraco back-office'inden olu\u015fturulabilen basit bir y\u00f6ntemken, JWT daha geli\u015fmi\u015f g\u00fcvenlik senaryolar\u0131 i\u00e7in uygundur. Test ortam\u0131nda, genellikle API anahtar\u0131 yeterli olabilirken, \u00fcretim ortam\u0131na yak\u0131n testlerde daha kapsaml\u0131 bir kimlik do\u011frulama s\u00fcreci gerekebilir.<\/dd>\n<dt>3. Bu testleri lokalde mi yoksa CI\/CD'de mi \u00e7al\u0131\u015ft\u0131rmal\u0131y\u0131z?<\/dt>\n<dd>Her iki yerde de \u00e7al\u0131\u015ft\u0131rmal\u0131s\u0131n\u0131z. Lokal ortamda, geli\u015ftiriciler yeni kod yazarken veya mevcut kodu de\u011fi\u015ftirirken an\u0131nda geri bildirim almal\u0131d\u0131r. CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) ortam\u0131nda ise, her kod de\u011fi\u015fikli\u011finde t\u00fcm test s\u00fciti otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131 ve herhangi bir regresyon veya hata durumunda geli\u015ftirme ekibine uyar\u0131 verilmelidir. Bu, yaz\u0131l\u0131m\u0131n s\u00fcrekli olarak da\u011f\u0131t\u0131ma haz\u0131r olmas\u0131n\u0131 sa\u011flar.<\/dd>\n<dt>4. Her de\u011fi\u015fiklikte t\u00fcm kabul testlerini \u00e7al\u0131\u015ft\u0131rmak gerekli mi?<\/dt>\n<dd>K\u00fc\u00e7\u00fck de\u011fi\u015fiklikler i\u00e7in, sadece ilgili testleri \u00e7al\u0131\u015ft\u0131rmak daha h\u0131zl\u0131 geri bildirim sa\u011flayabilir. Ancak kod birle\u015ftirme (merge) \u00f6ncesinde veya da\u011f\u0131t\u0131m \u00f6ncesinde t\u00fcm kabul testlerini \u00e7al\u0131\u015ft\u0131rmak, sistemin genel kararl\u0131l\u0131\u011f\u0131n\u0131 ve t\u00fcm i\u015flevselli\u011fin beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in kritik \u00f6neme sahiptir. Test s\u00fcresini optimize etmek i\u00e7in, \u00f6nemli olmayan veya \u00e7ok uzun s\u00fcren testleri daha az s\u0131kl\u0131kta \u00e7al\u0131\u015ft\u0131rabilirsiniz, ancak riskleri g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.<\/dd>\n<dt>5. Umbraco'nun kendi test ara\u00e7lar\u0131 var m\u0131?<\/dt>\n<dd>Umbraco'nun kendisi, \u00e7ekirdek i\u015flevselli\u011fi i\u00e7in kapsaml\u0131 birim ve entegrasyon testlerine sahiptir. Ancak bu makalede bahsetti\u011fimiz kabul testleri, sizin \u00f6zel Umbraco projenizin i\u015f mant\u0131\u011f\u0131n\u0131, belge t\u00fcrlerini, kompozisyonlar\u0131n\u0131 ve di\u011fer \u00f6zelle\u015ftirmelerini test etmek i\u00e7in yaz\u0131l\u0131r. Yani, Umbraco size bir API ve geni\u015fletilebilirlik noktalar\u0131 sunarak kendi testlerinizi yazman\u0131z i\u00e7in g\u00fc\u00e7l\u00fc bir altyap\u0131 sa\u011flar.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32933","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Umbraco API ile Kabul Testleri: TDD Prati\u011fi<\/title>\n<meta name=\"description\" content=\"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco&#039;nun g\u00fc\u00e7l\u00fc y\u00f6netim API&#039;sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Umbraco API ile Kabul Testleri: TDD Prati\u011fi\" \/>\n<meta property=\"og:description\" content=\"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco&#039;nun g\u00fc\u00e7l\u00fc y\u00f6netim API&#039;sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-27T10:01:44+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Umbraco API ile Kabul Testleri: TDD Prati\u011fi\",\"datePublished\":\"2025-10-27T10:01:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\"},\"wordCount\":4265,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\",\"name\":\"Umbraco API ile Kabul Testleri: TDD Prati\u011fi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-27T10:01:44+00:00\",\"description\":\"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco'nun g\u00fc\u00e7l\u00fc y\u00f6netim API'sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Umbraco API ile Kabul Testleri: TDD Prati\u011fi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Umbraco API ile Kabul Testleri: TDD Prati\u011fi","description":"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco'nun g\u00fc\u00e7l\u00fc y\u00f6netim API'sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.","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:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/","og_locale":"tr_TR","og_type":"article","og_title":"Umbraco API ile Kabul Testleri: TDD Prati\u011fi","og_description":"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco'nun g\u00fc\u00e7l\u00fc y\u00f6netim API'sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-27T10:01:44+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Umbraco API ile Kabul Testleri: TDD Prati\u011fi","datePublished":"2025-10-27T10:01:44+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/"},"wordCount":4265,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/","url":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/","name":"Umbraco API ile Kabul Testleri: TDD Prati\u011fi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-27T10:01:44+00:00","description":"Umbraco projelerinizde s\u00fcrekli de\u011fi\u015fen i\u00e7erik modelleri ve y\u00f6netim gereksinimleriyle kar\u015f\u0131la\u015f\u0131yor, yazd\u0131\u011f\u0131n\u0131z kodun beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmakta zorlan\u0131yor musunuz? Bu makale, Umbraco'nun g\u00fc\u00e7l\u00fc y\u00f6netim API'sini kullanarak Test G\u00fcd\u00fcml\u00fc Geli\u015ftirme (TDD) yakla\u015f\u0131m\u0131yla kabul testleri yazmay\u0131 ad\u0131m ad\u0131m \u00f6\u011freterek yaz\u0131l\u0131m kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/umbraco-api-ile-kabul-testleri-tdd-pratigi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Umbraco API ile Kabul Testleri: TDD Prati\u011fi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32933","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32933"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32933\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}