Moq'da Doğrulanabilir () 'in amacı nedir?


125

Amacı nedir Verifiable()?

Bir doğrulama yaparsam Mockve onunla dışarı bu terk hala doğrular SetUp.

Düzenleme: Ben VerifyAll()her şeyin doğrulanmasının sebebini kullanıyordum . İçin değiştirdikten sonra Verify()sadece benim .Verifiable() SetUpler kontrol ediliyordu.

Yanıtlar:


83

EK: Diğer yanıtın da belirttiği gibi, bunun amacı , daha sonra tetiklenebilen bir dizi "ertelenmiş çağrı" içerisine bir .Verifiablekayıt yapmaktır .SetupVerify(...)mock.Verify()

OP'nin açıklaması, amacın bu olduğunu ve tek sorunun neden işe yaramadığını anlamak olduğunu açıkça ortaya koyuyor, ancak @Liam'ın hazırladığı gibi, cevap da buna gerçekten değinmeli: - Elimden geldiğince temel kullanım durumları bkz:

  • a mock.Setup()ile arasında KURUYU korumakmock.Verify
  • bir doğrulamanın yapılandırmasını asıl Verifyaramanın kendisinden ayırmasına izin vermek (örneğin, başka bir yardımcı yöntemde kurabilirsiniz)

... ve kısaca etkili bir şekilde "dikkatli olun, çünkü bu hedeflere ulaşmanın, bu tür yapılara çok fazla dayanan testlerin okunabilirliği ve sürdürülebilirliği üzerindeki etkisinden ağır bastığı düşünüldüğünden, dikkatli olun" cevabıma geri dönelim.

ORİJİNAL: Mümkün olduğunda, AAA düzenini takip etmeniz gerektiğini ve bu nedenle , a ile eşleştirilmiş veya mümkün olan her yerde (kredi: @kzu ) yerine iş bittikten sonra açık mock.Verify( expression )aramalarmock.Setup( ... ).Verifiable()mock.Verify()mock.VerifyAll() yapılması gerektiğini unutmayın .


7
@EricSmith Geriye dönüp baktığımda, yeterince güçlü bir şekilde ifade ettiğimi sanmıyorum. Çalışmanızı AAA paketlemesine bölmek, Düzenleme ve İddia etme aşaması arasındaki ortak noktalara aşırı yoğunlaşmaktan çok daha fazla fayda sağlar. Zamanın% 90'ında, çağrıların sonunda Doğrulama çağrılarını nasıl ifade ettiğinize ilişkin nüanslardan kazanılacak bir şeyler vardır, bu nedenle, bazı durumlarda acı verici bir tekrar gibi görünse bile, bunu optimize etmek için çok zaman ayırmalısınız. Manning.com/osherove'nin çok iyi belirttiği noktalardan biri, teste giren biri için anlamlı bir test yapmanın kritik öneme sahip olmasıdır - bu yüzden geleneğe bağlı kalın !
Ruben Bartelink

3
Normalde kabul edilen bilgeliğe karşı çıkacak biri değilim, ancak AAA'nın her durumda Verifyable()/ / veya VerifyAll()her durumda faydalarına henüz ikna olmadım . Mevcut birim testimde çok sayıda Setup(...)çağrı var (> 30). Konvansiyonu sağlamak için her biri eşdeğer bir Verify () ile eşleştirilebilir, ancak bu büyük miktarda kod tekrarına neden olur ve birim testlerinin sayısı arttıkça bakımı ve okunması daha zor olacaktır. Sanırım gerçekten sorduğum şey, çok sayıda Kurulum varsa istisnalar yapılabilir mi, yoksa Verifiable()sert ve hızlı bir kuraldan kaçınma mı?
Steve Chambers

5
@SteveChambers AAA'nın temel unsurlarından biri A * olmamasıdır - tek bir Yasa ve tek bir Onay olmalıdır. Dolayısıyla, sizin için daha az kod olduğunu söylerken teknik olarak haklıyken, hangi (alt) Eylemler ve (alt) İddialar için Kurulumlarınızdan hangilerinin tesadüfleri her zaman bir mayın tarlası haline gelecektir. Yani hayır, zor ve hızlı değil, ama 50: 50'ye yakın olduğunu bile önermenin Çok Kötü Tavsiye olacağını söyleyebilirim. (Ayrıca, Yasa sırasında belirli bir davranış sergilemeye çalışmadığınız sürece Doğrulama yapmak için bir Kurulum yapmanız gerekmediğini unutmayın - ki bu da açık testlerin başka bir unsurudur)
Ruben Bartelink

1
@Liam Ve olduğunu tamamen iyi hala bunun işiniz için uygun bir araçtır ikna olduğunuzu gerçekten - bu düzgünce kuruluk elde olmasına rağmen yani - benim gerçek nokta mocks testler yazmaya genel yaklaşım olarak hoş karşılanmaz oluyor sadece budur a Setupve a arasında Verify, elde edilebilecek daha yüksek bir kazanımı kaçırıyor olabilir, yalnızca AAA ve güçlü bir şekilde ima eden strateji ailesi tarafından önerilen şekilde KURU kısıtlamasını gevşetmek olabilir
Ruben Bartelink

1
@Liam Prodding için teşekkürler; Cevabımı güncelledim çünkü yaptığınız noktada haklısınız. Böyle SO soruları cevapladığım günlerde, görüşüm genel olarak özlü bir şekilde atomik bir cevabı belirtmek ve sonra diğeri gibi yarışan cevapların haritayı doldurmasına izin vermekti. Bu günlerde (hala soruları cevaplamak için zaman ayırsaydım), bunun ilk etapta haline geldiği daha eksiksiz cevabı vermeye çalışacağım.
Ruben Bartelink

54

Ne zaman Verify()yöntem testin sonunda denir doğrulanabilir olarak işaretlenmiş beklentilerin herhangi denilen geçmezse, o zaman bir istisnadır thrown.

VerifyAll() doğrulanabilir beklentileri kontrol etmez.


VerifyAll () 'ın doğrulanabilir beklentileri kontrol etmediğini biraz daha açıklar mısınız?
JW

@JW Bu, VerifyAll'ın doğrulanabilir beklentiler olarak işaretlenip işaretlenmediklerini dikkate almadan tüm kurulumları doğruladığı anlamına gelir.
phoog
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.