Da ich keine wirklichen Erfahrungen mit Unit-Tests habe, versuche ich, einige Regeln zu sammeln, die ich zuerst lernen werde.
Achten Sie darauf, "Regeln" für Probleme zu lernen, auf die Sie noch nie gestoßen sind. Wenn Sie auf eine "Regel" oder "Best Practice" stoßen, würde ich vorschlagen, ein einfaches Spielzeugbeispiel dafür zu finden, wo diese Regel "verwendet" werden soll, und zu versuchen, dieses Problem selbst zu lösen, und dabei zu ignorieren, was die "Regel" sagt.
In diesem Fall könnten Sie versuchen, zwei oder drei einfache Klassen und einige Verhaltensweisen zu finden, die sie implementieren sollten. Implementieren Sie die Klassen so, wie es sich für Sie natürlich anfühlt, und schreiben Sie für jedes Verhalten einen Komponententest. Erstellen Sie eine Liste der aufgetretenen Probleme, z. B. wenn Sie anfingen, auf eine Weise zu arbeiten, und diese später ändern mussten. wenn Sie sich nicht sicher sind, wie die Dinge zusammenpassen sollen; wenn Sie sich darüber geärgert haben, Kesselschild zu schreiben; etc.
Dann versuchen , das gleiche Problem zu lösen , indem Sie die „Regel“. Erstellen Sie erneut eine Liste der aufgetretenen Probleme. Vergleichen Sie die Listen und überlegen Sie, welche Situationen besser sind, wenn Sie die Regel befolgen, und welche nicht.
Was Ihre eigentliche Frage betrifft , neige ich dazu, einen Port- und Adapter- Ansatz zu bevorzugen , bei dem zwischen "Kernlogik" und "Diensten" unterschieden wird (dies ähnelt der Unterscheidung zwischen reinen Funktionen und effektiven Prozeduren).
Bei der Kernlogik geht es darum, Dinge "innerhalb" der Anwendung basierend auf der Problemdomäne zu berechnen. Es könnte enthält Klassen wie User
, Document
, Order
, Invoice
, etc. Es ist in Ordnung zu haben Kernklassen rufen new
für andere Kern - Klassen, da sie „intern“ Implementierungsdetails. Wenn Sie beispielsweise eine Order
erstellen, können Sie auch eine Invoice
und eine Document
Detaillierung der Bestellung erstellen . Es ist nicht notwendig, diese während der Tests zu verspotten, da dies die tatsächlichen Dinge sind, die wir testen möchten!
Über die Ports und Adapter interagiert die Kernlogik mit der Außenwelt. Dies ist , wo Dinge wie Database
, ConfigFile
, EmailSender
usw. leben. Dies sind die Dinge, die das Testen schwierig machen. Daher ist es ratsam, diese außerhalb der Kernlogik zu erstellen und nach Bedarf weiterzugeben (entweder mit Abhängigkeitsinjektion oder als Methodenargumente usw.).
Auf diese Weise kann die Kernlogik (der anwendungsspezifische Teil, in dem sich die wichtige Geschäftslogik befindet und der die meisten Änderungen unterworfen sind) selbstständig getestet werden, ohne sich um Datenbanken, Dateien, E-Mails usw. kümmern zu müssen. Wir können nur einige Beispielwerte übergeben und überprüfen, ob wir die richtigen Ausgabewerte erhalten.
Die Ports und Adapter können separat mit Hilfe von Mocks für die Datenbank, das Dateisystem usw. getestet werden, ohne sich um die Geschäftslogik kümmern zu müssen. Wir können nur einige Beispielwerte übergeben und sicherstellen, dass sie gespeichert / gelesen / gesendet / usw. werden. passend.