Non ci sono due modi per farlo. I suggerimenti di ReSharper e alcune utili funzionalità di C # non sarebbero state usate così spesso se stavi scrivendo test di unità atomiche isolati per tutto il tuo codice.
Ad esempio, se si dispone di un metodo statico e si deve eseguire lo stub, non è possibile a meno che non si utilizzi un framework di isolamento basato su profilo. Una soluzione alternativa compatibile con la chiamata consiste nel modificare la parte superiore del metodo per utilizzare la notazione lambda. Ad 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 di Unit-Test, puoi stub questa chiamata in questo modo (supponendo che si trovi 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 try / finally o, nel clean-up del tuo unit test, quello che viene chiamato dopo ogni test, scrivi un codice come questo:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
che invocherà nuovamente l'inizializzatore statico della tua classe.
I Lambda Func non sono tanto ricchi di supporto quanto i normali metodi statici, quindi questo approccio ha i seguenti effetti collaterali indesiderati:
- Se il metodo statico era un metodo di estensione, devi prima modificarlo in un metodo non di estensione. Resharper può farlo automaticamente per te.
- Se uno qualsiasi dei tipi di dati dei metodi statici è un assembly di interoperabilità incorporato, come ad esempio Office, è necessario avvolgere il metodo, racchiudere il tipo o cambiarlo in "oggetto".
- Non è più possibile utilizzare lo strumento di refactoring delle firme delle modifiche di firma di Resharper.
Ma diciamo che si evita del tutto la statistica e si converte questo in un metodo di istanza. Non è ancora discutibile a meno che il metodo non sia virtuale o implementato come parte di un'interfaccia.
Quindi, in realtà, chiunque suggerisca il rimedio allo stub dei metodi statici è quello di renderli dei metodi di istanza, sarebbero anche contro i metodi di istanza che non sono virtuali o parte di un'interfaccia.
Quindi perché C # ha metodi statici?
Perché consente metodi di istanza non virtuali?
Se utilizzi una di queste "Funzioni", non puoi semplicemente creare metodi isolati.
Quindi quando li usi?
Usali per qualsiasi codice che non ti aspetti che qualcuno voglia mai spegnere. Qualche esempio:
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 si può parlare delle prestazioni di una chiamata indiretta, questa è un'altra ragione per evitare i metodi di istanza. Ci sono casi in cui è un successo in termini di prestazioni. Ecco perché i metodi non virtuali esistono in primo luogo.