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