Ekibimde uyguladığımız birim testlerimizle ilgili giderek daha sinir bozucu bir problemle mücadele ediyorum. İyi tasarlanmış olmayan eski kodlara birim testleri eklemeye çalışıyoruz ve testlerin gerçek eklenmesi konusunda herhangi bir zorluk yaşamadıkça, testlerin nasıl sonuçlanacağıyla mücadele etmeye başlıyoruz.
Sorunun bir örneği olarak, uygulamasının bir parçası olarak diğer 5 yöntemi çağıran bir yönteminiz olduğunu varsayalım. Bu yönteme yönelik bir test, adı verilen bu diğer 5 yöntemden birinin sonucu olarak bir davranış meydana geldiğini doğrulamak olabilir. Bu nedenle, bir birim testi sadece bir nedenden dolayı başarısız olması ve sadece bir nedenden ötürü, bu diğer 4 yöntemi çağırmanın neden olduğu olası sorunları ortadan kaldırmak ve onları alay etmek istiyorsunuz. Harika! Birim testi gerçekleştirilir, alay edilmiş yöntemler yoksayılır (ve davranışları diğer birim testlerinin bir parçası olarak onaylanabilir) ve doğrulama çalışır.
Ancak yeni bir sorun var - ünite testi, davranışın ve imzadaki herhangi bir değişikliğin gelecekteki diğer 4 yöntemden herhangi birinde veya “ana yönteme” eklenmesi gereken yeni yöntemlerin ne olduğunu onayladığınız konusunda kesin bir bilgiye sahip olacaktır. olası arızaları önlemek için ünite testini değiştirmek zorunda kalın.
Doğal olarak, sorun biraz daha az davranışla sonuçlanan daha fazla yönteme sahip olarak azaltılabilirdi, ancak belki de daha şık bir çözüm bulunabileceğini umuyordum.
İşte problemi yakalayan örnek bir test.
Kısa bir not olarak 'MergeTests' test ettiğimiz sınıftan miras kalan ve gerektiğinde davranışı geçersiz kılan ünite test sınıfıdır. Bu, dış sınıflara / bağımlılıklara yapılan çağrıları geçersiz kılmamıza izin vermek için testlerimizde kullandığımız bir 'kalıptır'.
[TestMethod]
public void VerifyMergeStopsSpinner()
{
var mockViewModel = new Mock<MergeTests> { CallBase = true };
var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>());
mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>);
mockViewModel.Setup(
m =>
m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(),
It.IsAny<bool>()));
mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo);
mockViewModel.Setup(m => m.SwitchToOverviewTab());
mockViewModel.Setup(m => m.IncrementSaveRequiredNotification());
mockViewModel.Setup(m => m.OnValidateAndSaveAll(It.IsAny<object>()));
mockViewModel.Setup(m => m.ProcessPendingActions(It.IsAny<string>()));
mockViewModel.Object.OnMerge(It.IsAny<MergeState>());
mockViewModel.Verify(mvm => mvm.StopSpinner(), Times.Once());
}
Geri kalanınız bununla nasıl başa çıktı ya da bununla baş etmenin harika bir 'basit' yolu yok mu?
Güncelleme - Herkesin geri bildirimini takdir ediyorum. Ne yazık ki, bu gerçekten de sürpriz değil, eğer test edilen kod zayıfsa, birim testinde izleyebileceğiniz harika bir çözüm, kalıp veya pratik görünmüyor. Bu basit gerçeği en iyi yakalayan cevabı işaretledim.