Про це немає двох шляхів. Пропозиції ReSharper та декілька корисних функцій C # використовуються не так часто, якби ви писали окремі тести атомних одиниць для всього свого коду.
Наприклад, якщо у вас є статичний метод і вам потрібно його заглушити, ви не можете, якщо не будете використовувати профіль ізоляції на основі профілю. Завдання, сумісне з викликом, - це змінити верхню частину методу для використання лямбда-позначення. Наприклад:
ПЕРЕД:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
ПІСЛЯ:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Ці два сумісні з дзвінками. Клієнтів не потрібно змінювати. Тіло функції залишається колишнім.
Потім у вашому коді Unit-Test ви можете заглушити цей виклик так (припустимо, що це у класі, який називається База даних):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Будьте обережні, щоб замінити його початковим значенням, коли закінчите. Це можна зробити через спробу / нарешті, або, у вашому прийомі тестування блоку, того, що викликається після кожного тесту, написати такий код, як цей:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
який повторно викликатиме статичний ініціалізатор вашого класу.
Функції Lambda не настільки багаті на підтримку, як звичайні статичні методи, тому такий підхід має такі небажані побічні ефекти:
- Якщо статичний метод був методом розширення, вам слід спершу змінити його на нерозширений метод. Resharper може зробити це за вас автоматично.
- Якщо будь-який із типів даних статичних методів є збіркою з вбудованим інтеропом, наприклад, для Office, вам доведеться обернути метод, обернути тип або змінити його на тип "об'єкт".
- Ви більше не можете використовувати інструмент рефакторингу змін підпису Resharper.
Але скажімо, що ви взагалі уникаєте статики, і перетворите це в метод екземпляра. Це все ще не піддається вибору, якщо метод не є віртуальним чи реалізованим як частина інтерфейсу.
Тож насправді кожен, хто пропонує виправити затруднення статичних методів, - це зробити їх екземплярами методів, вони також будуть проти методів екземплярів, які не є віртуальними або не є частиною інтерфейсу.
То чому C # має статичні методи? Чому це дозволяє використовувати невіртуальні методи екземпляра?
Якщо ви використовуєте будь-яку з цих "функцій", ви просто не можете створити окремі методи.
То коли ви їх використовуєте?
Використовуйте їх для будь-якого коду, який ви не очікуєте, що хтось коли-небудь захоче заглушити. Деякі приклади: метод Format () класу String, метод WriteLine () класу Console, метод Cosh () класу Math
І ще одне .. Більшість людей не переймається цим питанням, але якщо ви можете виконати непрямий дзвінок, це ще одна причина уникати методів екземплярів. Бувають випадки, коли це хіт виступу. Ось чому в першу чергу існують невіртуальні методи.