Não há duas maneiras sobre isso. As sugestões do ReSharper e vários recursos úteis do C # não seriam usados com tanta frequência se você estivesse escrevendo testes de unidade atômica isolados para todo o seu código.
Por exemplo, se você tem um método estático e precisa removê-lo, não pode, a menos que use uma estrutura de isolamento baseada em perfil. Uma solução compatível com chamada é alterar a parte superior do método para usar a notação lambda. Por exemplo:
ANTES:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
DEPOIS DE:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Os dois são compatíveis com chamadas. Os chamadores não precisam mudar. O corpo da função permanece o mesmo.
Em seguida, em seu código de teste de unidade, você pode stubar esta chamada da seguinte maneira (supondo que ela esteja em uma classe chamada Database):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Tome cuidado para substituí-lo pelo valor original após concluir. Você pode fazer isso através de uma tentativa / finalmente ou, na limpeza do teste de unidade, a chamada após cada teste, escreva um código como este:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
que reinvocará o inicializador estático da sua classe.
Os Funda Lambda não são tão ricos em suporte quanto os métodos estáticos regulares, portanto, essa abordagem tem os seguintes efeitos colaterais indesejáveis:
- Se o método estático for um método de extensão, primeiro você deverá alterá-lo para um método sem extensão. O Recarregador pode fazer isso por você automaticamente.
- Se qualquer um dos tipos de dados dos métodos estáticos for um assembly de interoperabilidade incorporada, como para o Office, você precisará agrupar o método, agrupar o tipo ou alterá-lo para o tipo 'objeto'.
- Você não pode mais usar a ferramenta de refatoração de assinatura de alteração do Resharper.
Mas digamos que você evite completamente a estática e a converta em um método de instância. Ainda não é ridículo, a menos que o método seja virtual ou implementado como parte de uma interface.
Portanto, na realidade, qualquer pessoa que sugerir o remédio para stubbing métodos estáticos deve torná-los métodos de instância, eles também estariam contra métodos de instância que não são virtuais ou fazem parte de uma interface.
Então, por que o C # tem métodos estáticos? Por que ele permite métodos de instância não virtuais?
Se você usar um desses "Recursos", simplesmente não poderá criar métodos isolados.
Então, quando você os usa?
Use-os para qualquer código que você não espere que alguém queira apagar. Alguns exemplos: o método Format () da classe String, o método WriteLine () da classe Console, o método Cosh () da classe Math
E mais uma coisa. A maioria das pessoas não liga para isso, mas se você puder sobre o desempenho de uma chamada indireta, esse é outro motivo para evitar métodos de instância. Há casos em que é um sucesso de desempenho. É por isso que existem métodos não virtuais em primeiro lugar.