2010-08-19 12 views
21

Bir Mock ve Stub arasındaki farkı anlıyorum.RhinoMock: Mocks Vs StrictMocks Vs DynamicMocks

Ancak RhinoMock çerçevesindeki farklı Mocks türleri beni şaşırtıyor. Birisi RhinoMock çerçevesi açısından Mocks Vs StrictMocks Vs DynamicMocks kavramlarını açıklayabilir. Yanıtlarınız büyük önem arz etmektedir.

cevap

28

Kesin bir alay, kullanılması için açıkça ayarlanmamış herhangi bir yöntemi kullanmaya çalışırsanız bir istisna atar.

Ayarlanmamış bir yöntemi kullanmaya çalışırsanız, dinamik (veya gevşek) bir alay bir istisna atar, yalnızca null değerine yönteminden varsayılan bir değer döndürür ve devam eder.

Sıkı alaylar genellikle bakım kâbusuna dönüştüğü için dinamik alayların kullanılması şiddetle tavsiye edilir. Sıkı ve dinamik bir kod örneği olan Here's a good blog post ve sıkı alayların genellikle neden kötü bir fikir olduğu.

+1

Nit-çekme -> "boş dönmek" –

+0

@Merlyn Morgan-Graham "dönüş türü için varsayılan değeri döndürür" gibi bir şey olmalı - büyük nokta :) – womp

+0

@Merlyn Morgan-Graham: Çok teşekkürler yıldırım hızlı tepki için çocuklar. çok takdir edildi. –

-2

Bu noktada kesinlikle katılmıyorum.

Muhtemelen Test Tahrikli Geliştirme dinamik mocks kullanarak mümkün değildir, çünkü test ettiğiniz şey mutlaka uygulamakta olduğunuz şey değildir.

Döngü içinde bir db çağrısı yaptığınız bir foreach döngüsü eklediğinizi düşünün. Bu çok kötü bir şekilde ölçeklenir. Bağımlılıklarınızı aşmak için dinamik alay kullandıysanız, db çağrılarıyla dalga geçmeyi muhtemelen kaybedersiniz, bu yüzden her db çağrısıyla kesinlikle dalga geçmenize gerek kalmayacağı için ölçeklenebilirlik sorununu kaçırırsınız.

public void myMethod() 
{ 
    externalMethod1.doSomething(); 
    foreach() 
    { 
     externalDbCall.doSql(); 
    } 
} 

public void testMyMethodWithDynamicMocksPassesAndMissesDbCallInLoop() 
{ 
    expect(externalMethod1.doSomething(); 
} 

public void testMyMethodWithStrictMocksFailsAndHighlightsDbCallInLoop() 
{ 
    expect(externalMethod1.doSomething(); 
} 
+8

Sahtekarların amacını anlayamıyor gibisiniz. Bir şeyle dalga geçtiğinizde, belli bir şeyi test edemezsiniz. DB koduyla dalga geçiyorsanız, DB kodunu test etmediğiniz içindir. –

+4

Soruyu cevaplamayı denediyseniz, cevabınız daha iyi olurdu. – Gevious

+1

@AndrewBarber Graham ile aynı fikirdeyim, ama sanırım onun noktası, umursanız da, alay konusu nesneyi değil, atasözlerini nasıl çağırıyorsunuz. –