Looking for unit-testing Keywords? Try Ask4Keywords

unit-testingAbhängigkeitsspritze


Bemerkungen

Ein Ansatz, der zum Schreiben von Software verwendet werden kann, besteht darin, Abhängigkeiten so zu erstellen, wie sie benötigt werden. Dies ist eine sehr intuitive Art, ein Programm zu schreiben, und die meisten Leute werden dazu neigen, unterrichtet zu werden, auch weil sie leicht zu verstehen sind. Eines der Probleme bei diesem Ansatz ist, dass er schwer zu testen sein kann. Stellen Sie sich eine Methode vor, die einige Verarbeitungsschritte basierend auf dem aktuellen Datum ausführt. Die Methode kann folgenden Code enthalten:

if (DateTime.Now.Date > processDate)
{
    // Do some processing
}

Der Code hängt direkt vom aktuellen Datum ab. Diese Methode kann schwer zu testen sein, da das aktuelle Datum nicht einfach manipuliert werden kann. Eine Möglichkeit, den Code besser testbar zu machen, besteht darin, den direkten Verweis auf das aktuelle Datum zu entfernen und stattdessen das aktuelle Datum an die Methode zu übergeben (oder zu injizieren), die die Verarbeitung durchführt. Diese Abhängigkeitsinjektion kann das Testen von Code-Aspekten durch Verwendung von Test-Doubles vereinfachen, um den Einrichtungsschritt des Komponententests zu vereinfachen.

IOC-Systeme

Ein weiterer zu berücksichtigender Aspekt ist die Lebensdauer von Abhängigkeiten. Wenn die Klasse selbst ihre eigenen Abhängigkeiten (auch als Invarianten bezeichnet) erstellt, ist sie für deren Beseitigung verantwortlich. Abhängigkeitsinjektion invertiert dies (weshalb wir eine Injektionsbibliothek häufig als "Inversion of Control" -System bezeichnen) und bedeutet, dass anstelle der Klasse, die für das Erstellen, Verwalten und Bereinigen ihrer Abhängigkeiten verantwortlich ist, ein externer Agent (in diesem Fall) In diesem Fall übernimmt das IoC-System dies.

Dies macht es viel einfacher, Abhängigkeiten zu haben, die von Instanzen derselben Klasse gemeinsam genutzt werden. Stellen Sie sich beispielsweise einen Dienst vor, der Daten von einem HTTP-Endpunkt abruft, damit eine Klasse sie konsumieren kann. Da dieser Dienst zustandslos ist (dh keinen internen Status hat), benötigen wir in der gesamten Anwendung nur eine einzige Instanz dieses Dienstes. Es ist zwar möglich (z. B. durch Verwendung einer statischen Klasse), dies manuell durchzuführen, es ist jedoch viel einfacher, die Klasse zu erstellen und dem IoC-System mitzuteilen, dass es als Singleton erstellt werden soll , wobei nur eine Instanz der Klasse vorhanden ist.

Ein anderes Beispiel wären Datenbankkontexte, die in einer Webanwendung verwendet werden, wobei ein neuer Kontext pro Anforderung (oder Thread) und nicht pro Instanz eines Controllers erforderlich ist. Dadurch kann der Kontext in jede von diesem Thread ausgeführte Ebene eingefügt werden, ohne dass manuell weitergegeben werden muss.

Dies befreit die konsumierenden Klassen von der Verwaltung der Abhängigkeiten.

Abhängigkeitsspritze Verwandte Beispiele