2016-07-10 13 views
5

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?

+0

Könnten Sie etwas Code - Ihrer Handler, und wie Sie versenden etc ...? – Alex

+0

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

Antwort

1

Ich habe mit dem gleichen Problem zu tun. Ich neige dazu, jede der Komponenten zu testen, die in dem Handler einzeln verwendet werden, und dann aufzubauen, irgendwie noch nicht 100% sicher, wo ich die Anfragen und Handler auf die gleiche Art und Weise teste, wie Herr Bogard die Tests durchgeführt hat das Mediatr-Projekt auf GitHub

+0

Ich überlege mir, ein "Nachrichten-Diagramm" zu erstellen, indem ich spezielle 'Post-Notification'-Handler und irgendeine Art von" Nachrichten-Relay "verwende. So kann ein Handler als Post-Notification-Handler für eine Nachricht (wie ein After-Event-Handler) markiert werden und ein solcher Handler kann als 'send another message'-Handler implementiert werden. Ich hoffe, in der Lage zu sein, eine "Kette" von Handlern aufzubauen, die auf den von ioc gefundenen Klassen basiert, und dann darauf zu bestehen. Ich denke, das wird besser sein, als die Kette tatsächlich auszuführen. – Vegar