TDD uygularsam özel yöntemlerden kaçınmalı mıyım?


99

Sadece şimdi TDD öğreniyorum. Anladığım kadarıyla özel yöntemler denenemez ve endişelenmemeli, çünkü genel API bir nesnenin bütünlüğünü doğrulamak için yeterli bilgi sağlayacak.

OOP'yi bir süredir anladım. Özel yöntemlerin nesneleri daha kapsüllenmiş hale getirdiğini, böylece değişime ve hatalara karşı daha dirençli hale getirdiğimi anlıyorum. Bu nedenle, varsayılan olarak kullanılmaları ve yalnızca müşterileri için önemli olan metotların halka açık hale getirilmesi gerekir.

Sadece özel yöntemleri olan ve olaylarını dinleyerek diğer nesnelerle etkileşime giren bir nesne yapmam mümkün. Bu çok kapsüllenmiş, ancak tamamen denenemez olurdu.

Ayrıca, test uğruna yöntemler eklemek için kötü bir uygulama olarak kabul edilir.

Bu TDD'nin kapsülleme ihtimaline sahip olduğu anlamına mı geliyor? Uygun bakiye nedir? Yöntemlerimin çoğunu veya tümünü şimdi herkese açık hale getirme eğilimindeyim ...


9
Yazılım endüstrisindeki kötü uygulama ve gerçeklik farklı hayvanlardır. İdeal bir durum iş dünyasında çarpıtılmış bir gerçeklikten daha sıktır. Mantıklı olanı yapın ve uygulama boyunca buna bağlı kalın. Uygulamaya yayılan ayın tadı yerine, kötü bir uygulama yapmayı tercih ederim.
Aaron McIver

10
"özel yöntemler denenemez" mi? Hangi dil? Bazı dillerde sakıncalıdır. Diğer dillerde bu tamamen basit. Ayrıca, kapsülleme tasarım ilkesinin her zaman birçok özel yöntemle uygulanması gerektiğini mi söylüyorsunuz ? Bu biraz aşırı görünüyor. Bazı dillerin özel yöntemleri yoktur, ancak yine de güzel bir şekilde kapsüllenmiş tasarımları vardır.
S.Lott,

“Benim özel yöntemlerin nesneleri daha kapsüllenmiş hale getirdiğini, dolayısıyla değişime ve hatalara daha dirençli hale getirdiğimi anlıyorum. Bu nedenle, varsayılan olarak kullanılmaları ve yalnızca müşterileri için önemli olan yöntemlerin halka açıklanması gerekir.” Bu bana TDD'nin başarmaya çalıştığı şeyin karşı bakış açısı gibi görünüyor. TDD, basit, uygulanabilir ve değişime açık tasarım oluşturmanıza yol açan geliştirme metodolojisidir. "Özelden" ve "sadece reklam yap ..." ifadeleri tamamen çevrilmiş olarak görülür. TDD'yi kucaklamak için özel bir yöntem diye bir şey olduğunu unutun. Daha sonra, gerektiği gibi yapın; yeniden düzenlemenin bir parçası olarak.
herby,


Yani @gnat, bunun, bu soruya verdiğim yanıttan çıkan sorunun bir kopyası olarak kapatılması gerektiğini mi düşünüyorsunuz? * 8 ')
Mark Booth,

Yanıtlar:


50

Uygulama üzerinde yapılan testler yerine arabirime test yapmayı tercih edin.

Anladığım kadarıyla özel yöntemler denenemez

Bu, geliştirme ortamınıza bağlıdır, aşağıya bakınız.

[özel yöntemler] endişelenmemelidir çünkü ortak API bir nesnenin bütünlüğünü doğrulamak için yeterli bilgi sağlayacaktır.

Bu doğru, TDD arayüzü test etmeye odaklanıyor.

Özel yöntemler, herhangi bir yeniden faktör döngüsü sırasında değişebilecek bir uygulama detayıdır. Arabirim veya kara kutu davranışını değiştirmeden yeniden faktörlendirmek mümkün olmalıdır . Aslında, bu TDD'nin yararının bir parçasıdır, bir sınıfa dahil olan değişimlerin bu sınıfa ait kullanıcıları etkilemeyeceğinden emin olmanın kolaylığı.

Sadece özel yöntemleri olan ve olaylarını dinleyerek diğer nesnelerle etkileşime giren bir nesne yapmam mümkün. Bu çok kapsüllenmiş, ancak tamamen denenemez olurdu.

Sınıf hiçbir yönteme sahiptir bile, olay işleyicileri bu kadar Olarak kamu arayüzü ve onun karşı olduğu kamu arabiriminde test edebilirsiniz.

Olaylar arabirim olduğundan, o nesneyi test etmek için oluşturmanız gereken olaylar.

Kullanarak içine bak sahte nesneleri olarak tutkal test sistemi için. Bir olay oluşturan ve durumun sonuçta meydana gelen değişimini (başka bir alıcı sahte nesne tarafından mümkün olabilir) yakalayan basit bir sahte nesne oluşturmak mümkün olmalıdır.

Ayrıca, test uğruna yöntemler eklemek için kötü bir uygulama olarak kabul edilir.

Kesinlikle, içsel durumu açığa vurmakta çok dikkatli olmalısınız .

Bu TDD'nin kapsülleme ihtimaline sahip olduğu anlamına mı geliyor? Uygun bakiye nedir?

Kesinlikle hayır.

TDD, sınıflarınızın uygulanmasını belki de basitleştirmek dışında değiştirmemelidir ( YAGNI'yi daha erken bir noktadan uygulayarak ).

TDD ile yapılan en iyi uygulama TDD'siz en iyi uygulama ile aynıdır, sadece nedenini daha erken öğrenirsiniz, çünkü arayüzü geliştirdiğiniz gibi kullanıyorsunuzdur.

Yöntemlerimin çoğunu veya tümünü şimdi herkese açık hale getirme eğilimindeyim ...

Bu bebeği banyo suyuyla atmak yerine daha iyi olur

Tüm metotları herkese açık hale getirmenize gerek kalmamalı, böylece TDD yöntemiyle geliştirilebilsin. Özel yöntemlerin gerçekten denenebilir olup olmadığını görmek için aşağıdaki notlarıma bakın.

Özel yöntemlerin test edilmesine daha ayrıntılı bir bakış

Eğer varsa mutlaka gerekir ünite sınıfının bazı özel davranışlarını test, dil / ortama bağlı, üç seçeneğiniz olabilir:

  1. Testleri test etmek istediğiniz sınıfa yerleştirin.
  2. Testleri başka bir sınıf / kaynak dosyaya yerleştirin ve test etmek istediğiniz özel yöntemleri genel yöntemler olarak gösterin.
  3. Test ve üretim kodunu ayrı tutmanıza izin veren, ancak yine de üretim kodunun özel yöntemlerine test kodu erişimi sağlayan bir test ortamı kullanın.

Açıkçası, 3. seçenek bugüne kadar en iyisidir.

1) Testleri test etmek istediğiniz sınıfa yerleştirin (ideal değil)

Test durumlarını test altındaki üretim koduyla aynı sınıf / kaynak dosyada saklamak en basit seçenektir. Ancak, pek çok ön işlemci yönergesi veya ek notu olmadan, üretim kodunuzu gereksiz yere şişiren test kodunuzla sona erecek ve kodunuzu nasıl yapılandırdığınıza bağlı olarak, yanlışlıkla bu uygulamanın kodunu kullanıcılara ifşa edebilirsiniz.

2) Test etmek istediğiniz özel yöntemleri herkese açık yöntemler olarak gösterin (gerçekten iyi bir fikir değil)

Önerildiği gibi, bu çok zayıf bir uygulamadır, kapsüllemeyi imha eder ve dahili uygulamayı kodun kullanıcılarına ifşa eder .

3) Daha iyi bir test ortamı kullanın (varsa en iyi seçenek)

Eclipse dünyasında, 3. parçaları kullanarak elde edilebilir . C # dünyasında kısmi sınıfları kullanabiliriz . Diğer diller / ortamlar genellikle benzer işlevselliğe sahiptir, sadece bulmanız gerekir.

Körce 1. veya 2. varsayımın, tek seçeneklerin, kirli çamaşırlarını halka açıkta yıkayan test koduyla veya kötü sınıf arayüzleriyle şişirilmiş üretim yazılımına yol açması muhtemel olacağını varsaymaktır. * 8' )

  • Sonuç olarak - olsa özel uygulamaya karşı test yapmamak daha iyidir.

5
Önerdiğin üç seçeneğin herhangi biriyle aynı fikirde olacağımdan emin değilim. Tercihim, yalnızca daha önce söylediğiniz gibi ortak arayüzü sınamak, ancak bunu yaparak özel yöntemlerin kullanılmasını sağlamak olacaktır. Bunu yapmanın avantajının bir kısmı, test kodunu dilin normal kullanımını kırmaya zorlarsanız ortaya çıkması muhtemel olmayan ölü kodu bulmaktır.
Magus

Yöntemleriniz bir şey yapmalı ve bir test, uygulamayı hiçbir şekilde dikkate almamalıdır. Özel yöntemler uygulama detaylarıdır. Yalnızca genel yöntemleri test etmek, testlerinizin entegrasyon testleri olduğu anlamına gelirse, bir tasarım probleminiz vardır.
Magus,

Yöntemi varsayılan / korumalı yapma ve aynı projeyle bir test projesinde bir test oluşturma hakkında ne düşünüyorsunuz?
RichardCypher

@RichardCypher 2) ile etkili bir şekilde aynıdır, çünkü yönteminizin özelliklerini test ortamınızdaki bir noksanlığa en iyi şekilde yerleştirmek için ne olacağını değiştiriyorsunuzdur, bu yüzden kesinlikle kötü bir uygulama.
Mark Booth,

75

Elbette özel yöntemlere sahip olabilirsiniz ve elbette bunları test edebilirsiniz.

Ya orada bazı sen o şekilde test edebilirsiniz bu durumda çalıştırmak için özel bir yöntem almanın yolu, ya da orada hiçbir çalıştırmak için özel almanın yolu, bu durumda: neden halt sadece, bunu test etmek çalışıyoruz lanet şeyi silin!

Örnekte:

Sadece özel yöntemleri olan ve olaylarını dinleyerek diğer nesnelerle etkileşime giren bir nesne yapmam mümkün. Bu çok kapsüllenmiş, ancak tamamen denenemez olurdu.

Bu neden denenemez? Yöntem bir olaya tepki olarak çağrılırsa, testin nesneyi uygun bir olaya beslemesini sağlayın.

Özel bir yönteme sahip olmamakla, kapsüllemeyi kırmamakla ilgili. Özel yöntemleriniz olabilir ancak bunları genel API üzerinden test etmeniz gerekir. Genel API olayları temel alıyorsa, olayları kullanın.

Özel yardımcı yöntemlerin daha yaygın olması durumunda, bunları çağıran genel yöntemlerle test edilebilirler. Özellikle, başarılı bir sınavdan geçmek için yalnızca kod yazmanıza izin verildiğinden ve testleriniz genel API'yi test ettiğinden, yazdığınız tüm yeni kodlar genellikle genel olacaktır. Özel yöntemler, yalnızca zaten var olan bir genel yöntemden çıkarıldıklarında Özütleme Yöntemi Yeniden Düzenlemesinin bir sonucu olarak görünür . Ancak bu durumda, kamu yöntemini test eden orijinal test, özel yöntemi de içerdiğinden, yine de özel yöntemi de kapsar.

Bu nedenle, genellikle özel yöntemler yalnızca zaten test edilmiş ortak yöntemlerden çıkarıldıkları ve dolayısıyla zaten test edildiklerinde görünürler.


3
Kamu yöntemleriyle test etmek zamanın% 99'unda işe yarıyor. Buradaki zorluk, tek bir kamu yönteminizin arkasında birkaç yüz ya da bin satırlık karmaşık kod satırı bulunduğunda ve tüm ara devletlerin uygulamaya özel olduğu zamanların% 1'idir. Kamu yönteminden tüm son durumları vurmaya çalışacak kadar karmaşık hale geldiğinde en iyi şekilde acı verici olur. Alternatif olarak, kenar kılıflarını enkapsülasyonu kırarak ve özel olarak daha fazla yöntemi ortaya koyarak ya da testlerin özel yöntemleri çağırması için bir kludge kullanarak test etmek, çirkin olmasının yanı sıra doğrudan kırılgan test vakalarına neden olur.
Dan Neely,

24
Büyük, karmaşık özel yöntemler kod kokusudur. Bileşen parçalarına (ortak arayüzlerle) faydalı bir şekilde ayrıştırılamayacak kadar karmaşık olan bir uygulama, potansiyel tasarım ve mimari sorunları ortaya çıkaran test edilebilirlikte bir sorundur. Özel kodun çok büyük olduğu vakaların% 1'i genellikle yeniden işleme tabi tutularak ortaya çıkarmak için yeniden işleme uygulamasından yararlanır.
S.Lott

13
@Dan Ne olursa olsun sadece böyle kod ne olursa olsun oldukça dengesiz - ve ünite testleri yazma parçası bu işaret ediyor. Durumları ortadan kaldırın, sınıfları ayırın, tüm tipik refactoringleri uygulayın ve sonra birim testleri yazın. Ayrıca TDD ile bu noktaya nasıl ulaştınız? Bu TDD'nin avantajlarından biri, test edilebilir kodların yazılması otomatik hale geliyor.
Bill K,

En azından sınıflardaki internalmetotlar veya genel metotlar, internaldoğrudan sık sık test edilmelidir. Neyse ki. Net destekliyor InternalsVisibleToAttribute, ancak onsuz bu yöntemi test etmek bir PITA olacaktır.
CodesInChaos

25

Kodunuzda yeni bir sınıf oluşturduğunuzda, bazı gereksinimleri cevaplamak için yaparsınız. Gereklilikler kodun ne yapması gerektiğini değil, ne yapması gerektiğini söyler . Bu, çoğu testin neden kamu yöntemleri düzeyinde gerçekleştiğini anlamayı kolaylaştırır.

Testler yoluyla, kodun beklendiği gibi yapıldığını, beklendiğinde uygun istisnalar attığını vb . Doğrularız. Uygulamaya, yani kodun yaptığı şeyi nasıl yaptığımızla ilgilenmiyor olsak da, özel yöntemleri test etmekten kaçınmak mantıklıdır.

Kamuya açık bir yöntemi olmayan ve dış dünyayla yalnızca olaylar aracılığıyla etkileşime giren sınıfları test etmeye gelince, bunu testler, olaylar göndererek ve yanıtları dinleyerek de test edebilirsiniz. Örneğin, bir sınıf her olay aldığında bir günlük dosyasını kaydetmesi gerekiyorsa, birim testi olayı gönderecek ve günlük dosyasının yazıldığını doğrulayacaktır.

Son fakat en az değil, bazı durumlarda özel yöntemleri test etmek için kesinlikle geçerlidir. Bu nedenle örneğin .NET'te, çözüm genel yöntemlerde olduğu kadar basit olmasa bile yalnızca genel değil, özel sınıfları da sınayabilirsiniz.


4
+1 TDD'nin önemli bir özelliği, YÖNTEMLER'in sizin yaptığınızı düşündüğünü yaptıklarını test etmek yerine GEREKLİLİKLERİN yerine getirildiğini test etmeye zorlamasıdır. Bu nedenle, "Özel bir yöntemi test edebilir miyim?" Sorusu TDD'nin ruhuna biraz aykırıdır - soru bunun yerine "uygulaması özel yöntemler içeren bir gereksinimi test edebilir miyim" olabilir. Ve bu sorunun cevabı açıkça evet.
Dawood ibn Kareem

6

Anladığım kadarıyla özel yöntemler denenemez

Bu ifadeye katılmıyorum, yoksa doğrudan özel yöntemleri test etmediğini söyleyebilirim . Genel bir yöntem, farklı özel yöntemler arayabilir. Belki yazar "küçük" yöntemlere sahip olmak istedi ve kodun bir kısmını akıllıca adlandırılmış bir özel yönteme çıkardı.

Genel yöntemin nasıl yazıldığına bakılmaksızın, test kodunuz tüm yolları kapsamalıdır. Testlerinizden sonra, bir özel yöntemdeki branş ifadesinden birinin (if / switch) testlerinizde hiçbir zaman kapsanmadığını keşfederseniz, bir sorun yaşarsınız. Bir vakayı kaçırdınız ya da uygulama doğru mu, ya da uygulama yanlış, ve bu dal aslında hiç olmamalıydı.

Bu nedenle, ortak yöntem testimin de özel yöntemleri kapsadığından emin olmak için Cobertura ve NCover'ı çok kullanıyorum. Özel yöntemlerle iyi OO nesneleri yazmaktan çekinmeyin ve TDD / Test'in bu şekilde yolunuza gitmesine izin vermeyin.


5

CUT'unuzun etkileşime girdiği örnekleri sağlamak için Bağımlılık Enjeksiyonu kullandığınız sürece, örneğiniz hala mükemmel bir şekilde test edilebilir. Daha sonra bir alay kullanabilir, ilgilenilen olayları oluşturabilir ve sonra CUT'un bağımlılıkları üzerinde doğru işlemleri yapıp yapmadığını gözlemleyebilirsiniz.

Öte yandan, iyi etkinlik desteğine sahip bir diliniz varsa, biraz farklı bir yol izleyebilirsiniz. Nesnelerin etkinliklere ne zaman abone olduklarını sevmem, bunun yerine nesneyi oluşturan fabrikayı, nesnenin genel yöntemlerine bağlar. Test edilmesi daha kolaydır ve CUT'un test edilmesi gereken olay türlerini harici olarak görünür kılar.


Bu harika bir fikir - "... nesneyi nesnenin genel yöntemlerine bağlayan nesneyi yaratan bir fabrikaya sahip. Test etmek daha kolay ve CUT'un ne tür olayların test edilmesi gerektiğini harici olarak görünür hale getiriyor. "
Pup,

5

Özel yöntemler kullanarak terk etmeniz gerekmez. Bunları kullanmak tamamen mantıklı, ancak test perspektifinden, kapsüllemeyi bozmadan veya testlerinize özel kodlar eklemeden doğrudan test etmek daha zordur. İşin püf noktası, bildiğiniz şeyleri en aza indirgemek, bağırsaklarınızı kısmak çünkü kodunuzu kirletmiş gibi hissediyorum.

Bunlar uygulanabilir bir dengeyi denemek ve elde etmek için aklımda kalan şeyler.

  1. Kullandığınız özel yöntem ve özelliklerin sayısını en aza indirin. Sınıfınıza ihtiyaç duyduğunuz şeylerin birçoğu kamuya açık olarak gösterilme eğilimindedir, bu nedenle bu akıllı yöntemi özel kılmaya gerçekten ihtiyaç duyup duymadığınızı düşünün.
  2. Özel yöntemlerinizdeki kod miktarını en aza indirin - gerçekten de yine de yapıyor olmalısınız - ve diğer yöntemlerin davranışlarıyla dolaylı olarak test edin. % 100 test kapsamı elde etmeyi asla beklemiyorsunuz ve belki de hata ayıklayıcı aracılığıyla birkaç değeri kontrol etmeniz gerekecek. Özel yöntemler atmak için özel yöntemler kullanma İstisnalar dolaylı olarak kolayca test edilebilir. Özel özelliklerin manuel olarak veya başka bir yöntemle test edilmesi gerekebilir.
  3. Eğer dolaylı veya manuel kontrol size uygun değilse, korumalı bir etkinlik ekleyin ve bazı özel şeyleri açığa çıkarmak için bir Arayüz üzerinden erişin. Bu, kapsülleme kurallarını etkili bir şekilde "büker", ancak testlerinizi uygulayan kodu gerçekten gönderme gereksinimini ortadan kaldırır. Dezavantajı, olayın gerektiğinde işten çıkarıldığından emin olmak için küçük bir iç kodla sonuçlanabilmesidir.
  4. Bir genel yöntemin yeterince "güvenli" olmadığını düşünüyorsanız, kullanım şeklini sınırlamak için yöntemlerinizde bir tür doğrulama işlemi uygulayabileceğiniz yollar olup olmadığına bakın. Muhtemelen bunu düşünürken ya yöntemlerini uygulamanın daha iyi bir yolunu düşünürsün ya da şekillenmeye başlayan başka bir sınıf görürsün.
  5. Genel yöntemleriniz için "şeyler" yapan birçok özel yönteminiz varsa, çıkarılmayı bekleyen yeni bir sınıf olabilir. Bunu doğrudan ayrı bir sınıf olarak test edebilirsiniz, ancak onu kullanan sınıf içinde özel olarak bir bileşik olarak uygulayabilirsiniz.

Yanal düşünün. Sınıflarınızı küçük tutun ve yöntemlerinizi daha küçük tutun ve çok fazla kompozisyon kullanın. Daha fazla çalışma gibi gözüküyor, ancak sonunda bireysel olarak test edilebilir öğelerle sonuçlanacak, testleriniz daha kolay olacak, gerçek, büyük ve karmaşık nesnelerin yerine basit alayları kullanmak için daha fazla seçeneğiniz olacak, umarım ki faktörlü ve gevşek bir şekilde birleştirilmiş kod; daha da önemlisi kendinize daha fazla seçenek sunacaksınız. İşleri küçük tutmak, sonunda size zaman kazandırır, çünkü her sınıfa ayrı ayrı bakmanız gereken şeyleri azaltırsınız ve bazen bir sınıf büyüyünce veya çok fazla olduğunda, ortaya çıkabilecek spagetti kodunu doğal olarak düşürürsünüz. birbirine bağlı kod davranışı dahili olarak.


4

Sadece özel yöntemleri olan ve olaylarını dinleyerek diğer nesnelerle etkileşime giren bir nesne yapmam mümkün. Bu çok kapsüllenmiş, ancak tamamen denenemez olurdu.

Bu nesne bu olaylara nasıl tepki veriyor? Muhtemelen, diğer nesnelere yöntem çağırması gerekir. Bu yöntemlerin çağrılıp çağrılmadığını kontrol ederek test edebilirsiniz. Sahte bir nesneyi aramasını isteyin ve sonra kolayca beklediğiniz şeyi yaptığını iddia edebilirsiniz.

Mesele şu ki, sadece nesnenin diğer nesnelerle olan etkileşimini test etmek istiyoruz. Bir nesnenin içinde neler olup bittiği umrumda değil. Yani hayır, daha önce hiç kamu yöntemine sahip olmamalısınız.


4

Ben de aynı konuda sorun yaşadım. Gerçekten, onu aşmanın yolu şudur: Programınızın geri kalanının bu sınıfla etkileşime girmesini nasıl beklersiniz? Sınıfınızı buna göre test edin. Bu, sizi programın geri kalanının onunla nasıl etkileşimde bulunduğuna dayanarak sınıfınızı tasarlamaya zorlar ve aslında sınıfınızın kapsüllenmesini ve iyi tasarımını teşvik eder.


3

Özel kullanım yerine varsayılan değiştirici. O zaman bu metotları tek tek test edebilirsiniz, sadece genel metodlarla değil. Bu, testlerinizin ana kodunuzla aynı paket yapısına sahip olmasını gerektirir.


... bunun Java olduğunu varsayarsak.
Dawood ibn Kareem

veya internal.
CodesInChaos

2

Birkaç özel yöntem genellikle bir sorun değildir. Bunları genel API ile yalnızca kod ortak yönteminize dahil edilmiş gibi test edin. Özel yöntemlerin fazlası, zayıf bir uyumun işareti olabilir . Sınıfınızın bir yapışkan sorumluluğa sahip olması gerekir ve çoğu zaman insanlar, gerçekte hiçbir şeyin olmadığı durumlarda yapışkanlığın ortaya çıkması için özel yöntemler kullanırlar.

Örneğin, bu olaylara yanıt olarak çok sayıda veritabanı çağrısı yapan bir olay işleyiciniz olabilir. Veri tabanı çağrıları yapmak için bir olay işleyicisini başlatmak açık bir şekilde kötü bir uygulama olduğu için, günaha, veritabanıyla ilgili tüm çağrıları gerçekten ayrı bir sınıfa çıkarmaları gerektiğinde özel yöntemler yapmaktır.


2

Bu TDD'nin kapsülleme ihtimaline sahip olduğu anlamına mı geliyor? Uygun bakiye nedir? Yöntemlerimin çoğunu veya tümünü şimdi herkese açık hale getirme eğilimindeyim.

TDD kapsülleme ihtimaline sahip değildir. Tercih ettiğiniz dile bağlı olarak, bir getter yöntemi veya özelliğinin en basit örneğini alın. Diyelim ki bir Müşteri nesnem var ve bir Kimlik alanı olmasını istiyorum. Yazacağım ilk test "customer_id_initializes_to_zero" gibi bir şey söyleyen bir sınav. Alıcının, uygulanmayan bir istisna atmasını ve testin başarısız olduğunu izlemesini tanımlarım. O zaman, bu testten geçmek için yapabileceğim en basit şey, alıcının sıfır getirisidir.

Oradan, muhtemelen müşteri kimliğini gerçek ve işlevsel bir alan olarak içeren diğer testlere giriyorum. Bir noktada, muhtemelen müşteri sınıfının alıcı tarafından nelerin geri dönmesi gerektiğini takip etmek için kullandığı özel bir alan oluşturmak zorundayım. Bunu tam olarak nasıl takip ederim? Basit bir destek int mi? Bir dizgiyi takip edip sonra int'ye çevirir miyim? 20 inç izliyorum ve ortalama mı? Dış dünya umursamıyor - ve TDD testleriniz umursamıyor. Bu kapsüllenmiş bir detaydır.

TDD'ye başlarken bunun hemen açık olmadığını düşünüyorum - sınıf içinde hangi yöntemlerin dahili olarak yaptığını test etmiyorsunuz - sınıfın daha az kapsamlı endişelerini test ediyorsunuz. Yani, bu yöntemin DoSomethingToFoo()bir Bar'ı başlattığını, bunun üzerine bir yöntemi çağırdığını, özelliklerinden ikisine birisini eklediğini, vb . Sınamak istemiyorsunuz. (ya da değil). Bu, testlerinizin genel şeklidir: "Test edilen sınıfa X yaptığımda, daha sonra Y'yi gözlemleyebilirim". Y'ye nasıl girdiği testlerin endişesi değildir ve kapsüllenen şey budur ve bu nedenle TDD'nin kapsülleme ile alakası yoktur.


2

Kullanmaktan kaçın? Hayır
kaçının ile başlayan ? Evet.

TDD ile soyut dersler almanın uygun olup olmadığını sormadığınızı fark ettim; TDD sırasında soyut sınıfların nasıl ortaya çıktığını anlarsanız, aynı ilke özel yöntemler için de geçerlidir.

Doğrudan özel sınıfları doğrudan test edemezsiniz gibi soyut sınıflardaki yöntemleri test edemezsiniz, ancak bu yüzden soyut sınıflar ve özel yöntemlerle başlamıyorsunuz; somut sınıflar ve genel API'ler ile başlıyorsunuz ve sonra ilerledikçe ortak işlevselliği yeniden değerlendiriyorsunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.