Es gibt keine zwei Möglichkeiten. Die Vorschläge von ReSharper und einige nützliche Funktionen von C # würden nicht so häufig verwendet, wenn Sie isolierte Atom-Unit-Tests für Ihren gesamten Code schreiben würden.
Wenn Sie zum Beispiel über eine statische Methode verfügen und diese entfernen müssen, können Sie dies nur tun, wenn Sie ein profilbasiertes Isolationsframework verwenden. Eine aufrufkompatible Problemumgehung besteht darin, den oberen Rand der Methode so zu ändern, dass die Lambda-Notation verwendet wird. Zum Beispiel:
VOR:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
NACH:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Die beiden sind anrufkompatibel. Anrufer müssen sich nicht ändern. Der Körper der Funktion bleibt der gleiche.
Dann können Sie in Ihrem Unit-Test-Code diesen Aufruf wie folgt stoppen (vorausgesetzt, er befindet sich in einer Klasse namens Database):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Ersetzen Sie es nach Beendigung des Vorgangs durch den ursprünglichen Wert. Sie können dies über einen try / finally-Befehl tun oder in Ihrer Unit-Test-Bereinigung den Code eingeben, der nach jedem Test aufgerufen wird:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
Dadurch wird der statische Initialisierer Ihrer Klasse erneut aufgerufen.
Lambda-Funcs sind nicht so unterstützend wie normale statische Methoden, daher hat dieser Ansatz die folgenden unerwünschten Nebenwirkungen:
- Wenn es sich bei der statischen Methode um eine Erweiterungsmethode handelte, müssen Sie diese zuerst in eine Nicht-Erweiterungsmethode ändern. Resharper kann dies automatisch für Sie tun.
- Wenn einer der Datentypen der statischen Methoden eine eingebettete Interop-Assembly ist, z. B. für Office, müssen Sie die Methode umbrechen, den Typ umbrechen oder in den Typ 'object' ändern.
- Sie können das Refactoring-Tool für Signaturänderungen von Resharper nicht mehr verwenden.
Nehmen wir jedoch an, Sie vermeiden die Statik vollständig und konvertieren sie in eine Instanzmethode. Es ist immer noch nicht verspottbar, es sei denn, die Methode ist entweder virtuell oder als Teil einer Schnittstelle implementiert.
In Wirklichkeit ist jeder, der die Lösung für das Stubben statischer Methoden vorschlägt, sie zu Instanzmethoden zu machen, auch gegen Instanzmethoden, die nicht virtuell oder Teil einer Schnittstelle sind.
Warum verfügt C # über statische Methoden? Warum sind nicht virtuelle Instanzmethoden zulässig?
Wenn Sie eine dieser "Funktionen" verwenden, können Sie einfach keine isolierten Methoden erstellen.
Also wann benutzt du sie?
Verwenden Sie sie für jeden Code, von dem Sie nicht erwarten, dass er jemals veröffentlicht werden soll. Einige Beispiele: Die Format () -Methode der String-Klasse Die WriteLine () -Methode der Console-Klasse Die Cosh () -Methode der Math-Klasse
Und noch etwas. Die meisten Leute interessieren sich nicht dafür, aber wenn Sie die Leistung eines indirekten Aufrufs beurteilen können, ist dies ein weiterer Grund, Instanzmethoden zu vermeiden. Es gibt Fälle, in denen die Leistung beeinträchtigt wird. Deshalb gibt es in erster Linie nicht-virtuelle Methoden.