1 ana sınıf ve 2 küçük sınıfta yeniden düzenlenmiş bir sınıf var. Ana sınıflar veritabanını kullanır (sınıflarımın çoğu gibi) ve bir e-posta gönderir. Yani ana sınıf bir IPersonRepository
ve bir IEmailRepository
enjekte var, bu da 2 küçük sınıfa gönderir.
Şimdi ana sınıfı ünite testi yapmak istiyorum ve sınıfın iç işleyişini ünite test etmemeyi öğrendim, çünkü ünite testlerini bozmadan iç işleri değiştirebilmeliyiz.
Sınıf kullanır Ama IPersonRepository
bir IEmailRepository
ben VAR bazı yöntemler için (sahte / kukla) sonuçlarını belirtmek için IPersonRepository
. Ana sınıf, bazı verileri mevcut verilere göre hesaplar ve döndürür. Bunu test etmek istersem, IPersonRepository.GetSavingsByCustomerId
x döndürmesini belirtmeden nasıl test yazabileceğimi göremiyorum . Ama sonra benim birim testim içsel çalışmaları 'bilir', çünkü hangi yöntemlerin alay edip hangilerini alamayacağını 'bilir'.
İçselleri bilmeden, bağımlılıkları enjekte edilen bir sınıfı nasıl test edebilirim?
arka fon:
Deneyimlerime göre, bu gibi birçok test havuzlar için alaylar oluşturur ve daha sonra alaylar için doğru verileri sağlar veya yürütme sırasında belirli bir yöntemin çağrılıp çağrılmadığını test eder. Her iki durumda da, test içselleri bilir.
Şimdi, testin uygulama hakkında bilmemesi gereken teori hakkında (daha önce duyduğum) bir sunum gördüm. Birincisi, nasıl çalıştığını test ettiğiniz için değil , aynı zamanda şimdi uygulamayı değiştirdiğinizde tüm birim testleri başarısız oluyor çünkü uygulama hakkında 'bilgi'. Testler kavramının uygulamanın farkında olmamasına rağmen, bunu nasıl başaracağımı bilmiyorum.
IPersonRepository
nesne beklediği anda , bu arayüz ve tarif ettiği tüm yöntemler artık "dahili" değildir, bu yüzden testin bir problemi değildir. Asıl sorunuz "herkese açık bir şekilde çok fazla maruz kalmadan sınıfları nasıl daha küçük birimlere yeniden aktarabilirim" olmalıdır. Cevap "bu arayüzleri yalın tut" (örneğin arayüz ayırma prensibine bağlı kalarak). Bu @ DavidArno'nun cevabında IMHO nokta 2 (Sanırım başka bir cevapta tekrarlamama gerek yok).