Ich habe gerade angefangen zu testen MediatR
, um unsere schweren beteiligten Web-Controller zu bereinigen. Die Funktionalität selbst zu implementieren ist nicht schwer, aber ich habe ein wenig Probleme mit dem Testen.Wie testet man mit MediatR
Ich begann mit einer Controller-Methode zum Abbrechen einer Bestellung.
Wenn eine Bestellung storniert wird, wo wir
- ein ‚annulliert‘ Flagge auf den Daten in der Datenbank
- Protokollierung einstellen, der das Treffen in einem Audit-Protokoll abgebrochen
- Senden einer Benachrichtigung per E-Mail zu irgendeinem Vorgesetzten.
All dies wurde innerhalb der Controller-Methode ausgelöst, wodurch die Steuerung von mehreren verschiedenen Diensten abhängig ist. Beim Testen mussten wir jeden Teil vortäuschen, um das Verhalten, das wir testen wollten, zu isolieren.
Die Art, wie ich dies mit MediatR
implementiert, war eine CancelOrder
-Abfrage von der Controller-Methode zu emittieren. Ich machte dann eine CancelOrderHandler
, die verantwortlich für die Speicherung der 'cancelled'-Flag ist.
Mit einer benutzerdefinierten MediatorPipeline
-Implementierung, emittiere ich eine OrderCancelled
-Benachrichtigung, wenn die CancelOrderHandler
keine Ausnahmen wirft.
Ich habe zwei Handler für diese Benachrichtigung: OrderCancelledAuditLogHandler
und OrderCancelledNotificationHandler
. Der erste kümmert sich um das Audit-Protokoll, der zweite sendet Benachrichtigungen.
Jeder Handler ist einfach zu testen. Aber wie kann ich testen, ob alles zusammenpasst? Ich möchte sicherstellen, dass bei der Stornierung eines Auftrags das Überwachungsprotokoll und die Benachrichtigung tatsächlich erledigt werden. Alle Handler machen Dinge, die ich während meiner Testausführung nicht wirklich will (Datenbankschreiben und E-Mail-Versand), und ich bin nicht scharf auf einen vollständigen Ende-zu-Ende-Integrationstest.
Irgendwelche Ideen?
Könnten Sie etwas Code - Ihrer Handler, und wie Sie versenden etc ...? – Alex
Nichts interessantes dort, denke ich ... Ich habe die Muster von [Bogards Blogpost] verfolgt (https://losechies.com/jimmybogard/2014/09/09/tackling-cross-cutting-concerns-with-a -mediator-pipeline /) und verwendet den IoC-Container zum Dekorieren aller 'IRequestHandler <>' s, um Post-Events zu senden. – Vegar