No hay dos maneras de hacerlo. Las sugerencias de ReSharper y varias características útiles de C # no se usarían tan a menudo 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 apagarlo, no puede hacerlo a menos que use un marco de aislamiento basado en perfiles. Una solución alternativa a la llamada 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 la llamada. 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 apilar esta llamada así (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 a través de una prueba / finalmente o, en la limpieza de su prueba de unidad, la que recibe una llamada 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.
Lambda Funcs no es tan rico en soporte como los métodos estáticos regulares, por lo que este enfoque tiene los siguientes efectos secundarios no deseados:
- 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 ti automáticamente.
- Si alguno de los tipos de datos de los métodos estáticos es un conjunto de interoperabilidad incrustado, como en el caso de Office, debe ajustar el método, ajustar el tipo o cambiarlo al tipo 'objeto'.
- Ya no puedes usar la herramienta de refactorización de cambio de firma de Resharper.
Pero digamos que evitas las estáticas y conviertes esto en un método de instancia. Todavía no se puede simular a menos que el método sea virtual o esté implementado como parte de una interfaz.
Entonces, en realidad, cualquiera que sugiera remediar los métodos estáticos es convertirlos en métodos de instancia, también estarían en contra de los métodos de instancia que no son virtuales o forman parte de una interfaz.
Entonces, ¿por qué C # tiene métodos estáticos?
¿Por qué permite métodos de instancia no virtual?
Si usa cualquiera de estas "Características", simplemente no puede crear métodos aislados.
Entonces, ¿cuándo los usas?
Úsalos para cualquier código que no esperes que nadie quiera apagar. 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 de Matemáticas
Y una cosa más ... La mayoría de las personas no se preocuparán por esto, pero si puedes sobre el rendimiento de una llamada indirecta, esa es otra razón para evitar los métodos de instancia. Hay casos en los que es un éxito de rendimiento. Es por eso que existen métodos no virtuales en primer lugar.