Ich habe ein paar kleine fließende Interfaces durch Methodenverkettung erstellt. Sie rufen normalerweise eine Reihe von Repositories auf, die Daten von Webservices / Datenbanken abrufen.
Wie sollte ich über Unit-Test-Methoden gehen, die die fließende Schnittstelle verwenden?
%Vor%Ich kann die einzelnen Komponenten der fließenden Schnittstelle einzeln testen, aber wenn ich die FindComputers-Methode oben testen möchte, was soll ich tun?
Ich würde gerne einen leicht zu wartenden Ansatz finden.
Ich denke, dass der FI mehr tut, als er braucht. Ich nehme an, dass Sie Computer als Data Mapper verwenden und auch zum Erstellen einer Abfrage verwenden. Aus dem, was Sie gezeigt haben, ist die Abfrage aufgebaut:
%Vor%und so weiter ...
Nun scheinen einige dieser Regeln, die implementiert werden können, falsch zu sein. Regel 2 und Regel 3 scheinen miteinander zu kreuzen. Regel 5 und Regel 6 macht was? Ist das in Ordnung?
Weil Sie ein Objekt implementiert haben, das SRP unterbricht. Der erste Schritt besteht darin, den Abfrage-Generator vom Data Mapper zu trennen. Erstellen Sie Ihr FI-Abfrageobjekt, und übergeben Sie es dann an den Mapper.
Jetzt können Sie FindComputers testen und sicherstellen, dass das FI-Query-Objekt an einen Data Mapper gesendet wird. Da Sie jetzt ein FI-Query-Objekt erstellen können, können Sie es testen. Und Sie können testen, dass der Data Mapper ein Abfrageobjekt verwendet.
Was ist, wenn Sie in Zukunft Computer nach Standort finden möchten? Wenn Sie den gleichen Code behalten, den Sie geschrieben haben, müssten Sie eine Methode hinzufügen FindByLocation und bevor Sie es wissen, haben Sie ein Gott-Objekt. stinkend!
Können Sie Ihre Repositories verspotten? Während einige für einen reineren Ansatz plädieren, bei dem Sie eine Methode einer Klasse isolieren müssen, wäre es eine gute Möglichkeit, zu testen, wie FindComputers und die fließende Oberfläche zusammenarbeiten. Und es kann einfacher sein, abhängig davon, wie die Repository-Zugriffsschicht aussieht.
Ich würde 2 + 3 machen. Unter der Annahme, dass die fließenden Schnittstellen echte Schnittstellen sind, sollten sie relativ einfach zu simulieren sein. Machen Sie sich einfach bewusst, dass jeder Schritt in der Aufrufkette wahrscheinlich ein neues Mock-Objekt zurückgibt, das wiederum den nächsten Aufruf in der Kette erwartet.
Sie sollten die fließende Oberfläche immer noch direkt testen, indem Sie die darunter liegende Repository-Ebene verspotten.
Tags und Links .net c# unit-testing fluent-interface