Bunun iki yolu yok. ReSharper'ın önerileri ve C # 'nın çeşitli faydalı özellikleri, tüm kodunuz için izole edilmiş atomik birim testleri yazıyor olsanız sık sık kullanılmazdı.
Örneğin, statik bir yönteminiz varsa ve onu silmeniz gerekiyorsa, profil tabanlı bir yalıtım çerçevesi kullanmıyorsanız kullanamazsınız. Çağrı uyumlu bir geçici çözüm, lambda notasyonu kullanmak için yöntemin üstünü değiştirmektir. Örneğin:
ÖNCE:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
SONRA:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
İki çağrı uyumludur. Arayanların değişmesi gerekmez. Fonksiyonun gövdesi aynı kalır.
Ardından, Birim-Test kodunuzda, bu çağrıyı bu şekilde saptayabilirsiniz (Veritabanı sınıfında olduğu varsayılarak):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
İşlemi tamamladıktan sonra orijinal değerle değiştirmeye dikkat edin. Bunu bir deneme / nihayet yaparak veya birim test temizlemenizde, her testten sonra çağrılana aşağıdaki gibi kod yazabilirsiniz:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
sınıfınızın statik başlatıcısını yeniden çağırır.
Lambda Funcs, normal statik yöntemler kadar destek açısından zengin değildir; bu nedenle, bu yaklaşım aşağıdaki istenmeyen yan etkilere sahiptir:
- Statik yöntem bir uzatma yöntemi ise, önce onu uzatma olmayan bir yönteme değiştirmeniz gerekir. Resharper bunu sizin için otomatik olarak yapabilir.
- Statik yöntemlerin veri türlerinden herhangi biri, Office için yerleşik bir birlikte çalışma derlemesi ise, yöntemi kaydırmanız, türü kaydırmanız veya 'nesne' türüne değiştirmeniz gerekir.
- Resharper'ın imza imzası yeniden düzenleme aracını artık kullanamazsınız.
Fakat diyelim ki, statikten tamamen kaçınmalısınız ve bunu bir örnek yöntemine dönüştürüyorsunuz. Yöntem sanal değilse ya da bir arabirimin parçası olarak uygulanmıyorsa, hala taklit edilemez.
Bu yüzden gerçekte, statik yöntemleri inat etmenin çaresini öneren herhangi biri, onlara örnek metotlar yapmaktır, sanal olmayan veya bir arayüzün parçası olan örnek metotlara karşı da olacaktır.
Peki neden C # statik yöntemlere sahip? Sanal olmayan örnek yöntemlere neden izin veriyor?
Bu "Özellikler" den herhangi birini kullanırsanız, o zaman izole edilmiş yöntemler oluşturamazsınız.
Peki onları ne zaman kullanıyorsun?
Bunları, hiç kimsenin taslak çıkarmak istememesini istediğiniz herhangi bir kod için kullanın. Bazı örnekler: String sınıfının Format () yöntemi, Console sınıfının WriteLine () yöntemi, Math sınıfının Cosh () yöntemidir.
Ve bir şey daha var .. Çoğu insan bunu umursamıyor, ancak dolaylı bir çağrının performansını merak ediyorsanız, bu örnek yöntemlerden kaçınmak için başka bir neden. Bunun bir performans vuruşu olduğu durumlar var. Bu yüzden ilk başta sanal olmayan yöntemler var.