No hay dos formas de hacerlo. Las sugerencias de ReSharper y varias características útiles de C # no se usarían con tanta frecuencia si estuviera escribiendo pruebas de unidades atómicas aisladas para todo su código.
Por ejemplo, si tiene un método estático y necesita eliminarlo, no puede hacerlo a menos que use un marco de aislamiento basado en perfil. Una solución alternativa compatible con llamadas es cambiar la parte superior del método para usar la notación lambda. Por ejemplo:
ANTES DE:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
DESPUÉS:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Los dos son compatibles con llamadas. Las personas que llaman no tienen que cambiar. El cuerpo de la función sigue siendo el mismo.
Luego, en su código de Prueba de unidad, puede anular esta llamada de esta manera (suponiendo que esté en una clase llamada Base de datos):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Tenga cuidado de reemplazarlo con el valor original una vez que haya terminado. Puede hacerlo mediante un intento / finalmente o, en la limpieza de la prueba de la unidad, la que se llama después de cada prueba, escriba un código como este:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
que volverá a invocar el inicializador estático de su clase.
Las funciones Lambda no son tan ricas en soporte como los métodos estáticos regulares, por lo que este enfoque tiene los siguientes efectos secundarios indeseables:
- Si el método estático era un método de extensión, primero debe cambiarlo a un método sin extensión. Resharper puede hacer esto por usted automáticamente.
- Si alguno de los tipos de datos de los métodos estáticos es un ensamblado de interoperabilidad incrustado, como para Office, debe ajustar el método, ajustar el tipo o cambiarlo a tipo 'objeto'.
- Ya no puede usar la herramienta de refactorización de cambio de firma de Resharper.
Pero supongamos que evita las estáticas por completo, y convierte esto a un método de instancia. Todavía no se puede imitar a menos que el método sea virtual o esté implementado como parte de una interfaz.
Entonces, en realidad, cualquiera que sugiera el remedio para tropezar con métodos estáticos es hacerlos métodos de instancia, también estarían en contra de los métodos de instancia que no son virtuales o no son parte de una interfaz.
Entonces, ¿por qué C # tiene métodos estáticos? ¿Por qué permite métodos de instancia no virtuales?
Si utiliza cualquiera de estas "Características", simplemente no puede crear métodos aislados.
Entonces, ¿cuándo los usas?
Úselos para cualquier código que no espere que nadie quiera borrar. Algunos ejemplos: el método Format () de la clase String, el método WriteLine () de la clase Console, el método Cosh () de la clase Math
Y una cosa más ... A la mayoría de las personas no les importará esto, pero si puede hacerlo sobre el rendimiento de una llamada indirecta, esa es otra razón para evitar los métodos de instancia. Hay casos en que es un éxito de rendimiento. Es por eso que existen métodos no virtuales en primer lugar.