Tidak ada dua cara tentang itu. Saran ReSharper dan beberapa fitur berguna dari C # tidak akan digunakan sesering jika Anda menulis tes unit atom terisolasi untuk semua kode Anda.
Misalnya, jika Anda memiliki metode statis dan Anda harus mematikannya, Anda tidak bisa kecuali Anda menggunakan kerangka kerja isolasi berbasis profil. Pemecahan masalah yang kompatibel dengan panggilan adalah mengubah bagian atas metode untuk menggunakan notasi lambda. Sebagai contoh:
SEBELUM:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
SETELAH:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Keduanya kompatibel dengan panggilan. Penelepon tidak harus berubah. Tubuh fungsi tetap sama.
Kemudian dalam kode Unit-Test Anda, Anda dapat mematikan panggilan ini seperti itu (dengan asumsi itu dalam kelas yang disebut Database):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Berhati-hatilah untuk menggantinya dengan nilai asli setelah Anda selesai. Anda dapat melakukannya melalui percobaan / akhirnya atau, dalam pembersihan unit-tes Anda, tes yang dipanggil setelah setiap tes, tulis kode seperti ini:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
yang akan memanggil kembali initializer statis kelas Anda.
Fungsi Lambda tidak terlalu kaya dalam dukungan seperti metode statis biasa, sehingga pendekatan ini memiliki efek samping yang tidak diinginkan:
- Jika metode statis adalah metode ekstensi, Anda harus mengubahnya ke metode non-ekstensi terlebih dahulu. Resharper dapat melakukan ini untuk Anda secara otomatis.
- Jika salah satu tipe data dari metode statis adalah rakitan tertanam-interop, seperti untuk Office, Anda harus membungkus metode, membungkus jenis atau mengubahnya untuk mengetikkan 'objek'.
- Anda tidak bisa lagi menggunakan alat refactoring perubahan tanda tangan Resharper.
Tetapi katakanlah Anda menghindari statika sama sekali, dan Anda mengonversinya menjadi metode instan. Itu masih tidak bisa dipermainkan kecuali metode ini virtual atau diimplementasikan sebagai bagian dari antarmuka.
Jadi pada kenyataannya, siapa pun yang menyarankan solusi untuk mematikan metode statis adalah menjadikannya metode instan, mereka juga akan menentang metode instan yang bukan virtual atau bagian dari antarmuka.
Jadi mengapa C # memiliki metode statis? Mengapa ini memungkinkan metode instance non-virtual?
Jika Anda menggunakan salah satu dari "Fitur" ini, maka Anda tidak dapat membuat metode yang terisolasi.
Jadi kapan Anda menggunakannya?
Gunakan mereka untuk kode apa pun yang Anda tidak harapkan ada orang yang ingin mematikannya. Beberapa contoh: metode Format () dari kelas String metode WriteLine () dari kelas Konsol metode Cosh () dari kelas Matematika
Dan satu hal lagi .. Kebanyakan orang tidak akan peduli tentang ini, tetapi jika Anda bisa tentang kinerja panggilan tidak langsung, itu alasan lain untuk menghindari metode instan. Ada kasus ketika itu adalah hit kinerja. Itu sebabnya metode non-virtual ada di tempat pertama.