Ich lese, dass Sie der Meinung sind, dass Unit-Tests, ähnlich wie SOLID-Objekte, "einen Grund zum Brechen" haben müssen. Es ist ein nobles Ziel, aber ich denke, Sie werden feststellen, dass es in vielen Fällen einfach nicht machbar ist. In einem dieser Fälle haben Sie ein "reichhaltiges" Domänenobjekt (DDD unterscheidet zwischen Entitäten und Wertobjekten, die beide das "Domänenmodell" umfassen), das eine Abhängigkeit des zu testenden Systems darstellt.
In diesen Situationen habe ich die Philosophie, die gegeben istDas Domänenobjekt verfügt über eine eigene umfassende Abdeckung für Komponententests. Das Vertrauen, dass das Objekt wie in einem Komponententest für ein anderes SUT entworfen funktioniert, verstößt nicht unbedingt gegen den Komponententest. Wenn dieser Test aufgrund einer Änderung der Domäne unterbrochen würde, würde ich erwarten, dass auch der Komponententest des Domänenobjekts unterbrochen wird, was mich zu etwas führt, das untersucht werden muss. Wenn der Komponententest des Domänenobjekts ordnungsgemäß als roter Test aktualisiert und dann mit der Änderung grün gemacht wurde und dieser andere Test dann fehlgeschlagen ist, ist dies auch nicht unbedingt eine schlechte Sache. Dies bedeutet, dass die Erwartungen dieses anderen Tests im Widerspruch zu den neuen Erwartungen für die Domäne stehen, und ich muss sicherstellen, dass beide miteinander und mit den übergeordneten Akzeptanzkriterien des Systems übereinstimmen.
Als solches würde ich ein Domänenobjekt nur verspotten, wenn dieses Domänenobjekt "Nebenwirkungen" hervorrief, die aus Sicht der Komponententests unerwünscht waren (dh externe Ressourcen wie Datenspeicher berühren), oder wenn die Logik des Domänenobjekts ausreichend komplex wäre Das Versetzen in den richtigen Zustand für den Test wird zu einem Hindernis für die Definition und das Bestehen des Tests.
Das wird dann zur treibenden Frage; was ist einfacher Um das Domain-Objekt für den beabsichtigten Zweck innerhalb des Tests zu verwenden oder es zu verspotten? Tun Sie, was einfacher ist, bis es nicht mehr die einfachere Option ist, z. B. wenn eine Funktionsänderung den Test des Dienstes auf komplexe Weise durchbricht. Wenn dies passiert, schreiben Sie den Test neu, um ein Modell zu erstellen, das die vom Service abhängigen funktionalen Anforderungen aufdeckt, ohne die Komplexität, die ihn bricht.
In beiden Fällen sollte es einen Integrationstest geben, der das in den realen Dienst eingesteckte reale Domänenobjekt verwendet, das die Interaktion zwischen diesen beiden auf einer höheren Abstraktionsebene testet (z. B. zum Testen nicht nur der Funktionalität hinter einem Dienst Endpunkt, aber ein Proxy, über den das Domänenobjekt serialisiert und gesendet wird).