Rhino Mocks'taki alaylarla taslaklar arasındaki farklar nelerdir?


149

Bununla yeterince oynamadım ve genellikle alay kullanıyorum, ancak bu ikisi arasındaki ve ne zaman Rhino Mocks'ta diğerini ne zaman kullanacağını merak ediyorum.

Güncelleme:

Sorumun cevabını Ayende'nin sözleriyle de buldum :

Saplamalar ve alaylar arasındaki fark

Bu makalede şu terimlerin gerçek tanımını alabilirsiniz: Alaylar Saplama Değildir . Rhino Mocks açısından farklılığa odaklanmak istiyorum.

Bir alay, beklentileri belirleyebileceğimiz ve beklenen eylemlerin gerçekten gerçekleştiğini doğrulayacak bir nesnedir. Saplama, test edilen koda geçmek için kullandığınız bir nesnedir. Üzerinde beklentiler oluşturabilirsiniz, böylece belirli şekillerde hareket eder, ancak bu beklentiler asla doğrulanmaz. Bir saplamanın özellikleri otomatik olarak normal özellikler gibi davranır ve bunlardan beklentiler belirleyemezsiniz.

Test edilen kodun davranışını doğrulamak istiyorsanız, uygun beklentiyle bir alay kullanacak ve bunu doğrulayacaksınız. Sadece belirli bir şekilde davranması gerekebilecek bir değeri geçmek istiyorsanız, ancak bu testin odağı değilse, bir saplama kullanacaksınız.

ÖNEMLİ: Saplama hiçbir zaman testin başarısız olmasına neden olmaz.


Yanıtlar:


148

Gereğince bu

... Basitçe söylemek gerekirse Mock ve Stub nesneleri arasında bir fark vardır ve RhinoMocks, amaçlarını daha iyi ifade eden testler yazmamıza izin verdiğini kabul eder.

Sahte nesneler beklentileri tanımlamak için kullanılır yani: Bu senaryoda böyle bir parametre ile A () yönteminin çağrılmasını bekliyorum. Alaycılar bu beklentileri kaydeder ve doğrular.

Öte yandan, taslakların farklı bir amacı vardır: beklentileri kaydetmezler veya doğrulamazlar, daha ziyade bir test senaryosu kullanmak için davranışı, “sahte” nesnenin durumunu “değiştirmemize” izin verirler ...


Bu soru için kabul edilen cevapla aynı mesajı yansıtan başka bir yararlı yazı buldum - martinfowler.com/articles/mocksArentStubs.html .
singh1469

20

Genel olarak konuşursak, Birim çağrı işlevlerini ve yöntemlerini test eder ve sonra beklenen davranışın gerçekleşip gerçekleşmediğini kontrol eder. Bu işlevler ve yöntemler parametreler gerektirebilir. Bu parametreleri karşılamak için taslaklar ve alaylar kullanıyoruz. Bazen küresel nesnelerle de alay edebiliriz.

koçanları

Saplama, testinizin işlev çağrısını çalıştırmak için parametre olarak kullanabileceği küçük sahte bir nesnedir. Bu, test edilen işlevin davranışını doğrulamamızı sağlar. Herhangi bir yan etkiyi doğrulamamıza izin vermez, çünkü saplamanın hiçbir uygulaması yoktur.

Mocks

Alay, bir uygulaması olan bir saplamadır. Test altındaki fonksiyonumuz sahte nesnemizle etkileşime giriyorsa, sahte modelin beklediğimiz gibi etkileşime girdiğini doğrulayabiliriz.

Örneğin, sahte bir User nesnesimiz olduğunu ve session.login yöntemimizin çalıştığını doğrulamak istediğimizi, user.lastLoggedIn öğesinin ayarlandığını kontrol etmek istediğimizi varsayalım. Bu yöntemi uygulayan sahte bir kullanıcı oluşturabiliriz. Session.login öğesini çağırdığımızda, user.lastLoggedIn öğesinin beklediğimiz duruma sahip olduğunu söyleyebiliriz.

Sonuç olarak

Sahte, yan etkileri test etmemizi sağlayan bir uygulamaya sahip bir saplamadır.

Bu fark hala önemli mi?

Daha çok benzetmeler ve benzetmeler arasındaki fark gibi, taslaklar ve alaylar arasındaki fark ince ve tarihseldir ve belki de test dünyasındaki farklı topluluklar ve felsefelerle büyük teknik farklılıklardan daha fazla ilgisi vardır.

Test için biraz farklı yaklaşımları temsil ederler. Sahte bir saplama gibi yazılabilir. Bir saplama genellikle bir sahte olarak genişletilebilir.

Hangisini kullanmalısınız?

Saplama oluşturmaya başladığınızı görebilirsiniz, daha sonra bazı nesneleriniz için alaylarda tam olarak oluşturmanız gerektiğini görebilirsiniz. Gittiğiniz her şeyi alay etmek isteyebilirsiniz ya da sadece gerektiğinde alay etmek isteyebilirsiniz.


7

Mock ve saplama arasındaki fark: saplama ile, birim testinizin girdisini düzeltirsiniz: böylece birim testiniz, bazı yöntemin uygulanmasını yeniden yazarak saplama ve Saplama üzerinde iddiada bulunmaz. Mock ile, birim testinizin çıkışını düzeltirsiniz: böylece birim testiniz, sahte nesnenizdeki dahili etkileşimi kontrol ederek Mocking nesneniz hakkında bir beklenti yapar.


Testinizin bir alayın çıktısını "kontrol etmesi" gerektiğini söylüyorsunuz. Eğer söylediğiniz buysa, yanılıyorsunuz. Bir taklitin test edilmesi gerekmemektedir; orada diğer kodları test edebilirsiniz . Yoksa son cümleniz başka bir şey mi ifade ediyor?
Andrew Barber

1
Merhaba Andrew, ben Mock ile yazdığınız gibi test etmeyecek şekilde testinizin çıktısını düzeltirsiniz.Aksi takdirde Mock etkileşimi kontrol etmenize izin verdiğini yazdım (beklenti davranışı ... ;-)
Hassan Boutougha

1
Tamam, bu daha mantıklı. Açıklama için teşekkürler!
Andrew Barber

> saplama üzerinde iddiada bulunmuyor Neden birçok iddia kütüphanesinde parametreleri should have been called withiddia etmek için aka yöntemler hala mevcuttur stub.
hellboy

5

Moq framework - kurulum yöntemi STUB olduğu gibi Doğrulama yöntemi Mock olduğu gibi


0

Ben de fark ettim bir şey MockRepository.GenerateMock kullandığımda, açıkça bu çağrıyı durdurmak için belirli bir yöntem çağrısında beklentileri ayarlamak gerekir olmasıdır. Saplamalarla, sanal olduğu sürece herhangi bir yöntemi otomatik olarak kesiyor gibi görünüyor.

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.