Non ci sono due modi per farlo. I suggerimenti di ReSharper e le varie utili funzioni di C # non verrebbero utilizzate così spesso se si scrivessero test di unità atomiche isolate per tutto il codice.
Ad esempio, se si dispone di un metodo statico e è necessario eliminarlo, non è possibile se non si utilizza un framework di isolamento basato sul profilo. Una soluzione alternativa compatibile con le chiamate consiste nel modificare la parte superiore del metodo per utilizzare la notazione lambda. Per esempio:
PRIMA:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
DOPO:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
I due sono compatibili con le chiamate. I chiamanti non devono cambiare. Il corpo della funzione rimane lo stesso.
Quindi nel tuo codice Unit Test, puoi stub questa chiamata in questo modo (supponendo che sia in una classe chiamata Database):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Fai attenzione a sostituirlo con il valore originale dopo aver finito. Puoi farlo tramite un tentativo / finalmente o, nel tuo clean-test dell'unità, quello che viene chiamato dopo ogni test, scrivere un codice come questo:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
che richiamerà l'inizializzatore statico della tua classe.
I Lambda Func non sono così ricchi di supporto come i normali metodi statici, quindi questo approccio ha i seguenti effetti collaterali indesiderati:
- Se il metodo statico era un metodo di estensione, è necessario prima modificarlo in un metodo non di estensione. Resharper può farlo automaticamente per te.
- Se uno dei tipi di dati dei metodi statici è un assembly di interoperabilità incorporato, ad esempio Office, è necessario racchiudere il metodo, avvolgere il tipo o modificarlo per digitare "oggetto".
- Non è più possibile utilizzare lo strumento di refactoring per la firma delle modifiche di Resharper.
Ma supponiamo che tu eviti del tutto la statica e la converti in un metodo di istanza. Non è ancora derisorio a meno che il metodo non sia virtuale o implementato come parte di un'interfaccia.
Quindi, in realtà, chiunque suggerisca il rimedio per eliminare i metodi statici è di renderli metodi di istanza, sarebbero anche contro metodi di istanza che non sono virtuali o che fanno parte di un'interfaccia.
Quindi perché C # ha metodi statici? Perché consente metodi di istanza non virtuali?
Se si utilizza una di queste "Funzionalità", semplicemente non è possibile creare metodi isolati.
Quindi quando li usi?
Usali per qualsiasi codice che non ti aspetti che qualcuno voglia mai stub. Alcuni esempi: il metodo Format () della classe String il metodo WriteLine () della classe Console il metodo Cosh () della classe Math
E un'altra cosa ... La maggior parte delle persone non si preoccuperà di questo, ma se è possibile eseguire una chiamata indiretta, questo è un altro motivo per evitare i metodi di istanza. Ci sono casi in cui si tratta di un successo prestazionale. Ecco perché esistono in primo luogo metodi non virtuali.