2016-03-21 15 views
1

Ich möchte ein Modul testen, indem ich es über die Ereignisaggregation mit Meldungen versehe, um sicherzustellen, dass es entsprechend reagiert, indem es Eigenschaften entsprechend einstellt oder andere Nachrichten veröffentlicht . Ich bin mit Prism 6. In meinem Projekt hat das Infrastrukturprojekt:Komponententests mit Moq, Prism 6 und Ereignisaggregation

public class ImportantMessage : PubSubEvent<string> 
{ 
} 

ModuleA eine Meldung wie diese veröffentlicht:

eventAggregator.GetEvent<ImportantMessage>().Publish(importantString); 

ModuleB empfängt die Nachricht wie folgt aus:

eventAggregator.GetEvent<ImportantMessage>().Subscribe(HandleImportantMessage); 

Hier ist HandleImportantMessage:

public void HandleImportantMessage(string importantString) 
{ 
    . . . 
} 

Die ModuleB Konstruktor wird wie folgt aufgerufen:

ModuleB(IEventAggregator EventAggregator) 

Dieser Konstruktor von dem Prism Rahmen genannt wird. Für Komponententests muss ich eine Instanz von ModuleB erstellen und einen IEventAggregator übergeben, der wahrscheinlich von Moq erstellt wurde. Und ich möchte das so machen, dass die Nachricht, die ich veröffentliche, wichtig ist. Wenn ich den Ausdruck "Komponententests mit moq und Ereignisaggregation" google, gibt es mehrere Referenzen, aber ich habe nicht gesehen, wie einer dieser Ansätze verwendet wird, um "wichtigString" von ModuleA zu ModuleB zu übergeben. Der Beispielcode für Prism 5 erstellt einen falschen Ereignisaggregator, ohne jedoch Moq zu verwenden. Ich verstehe nicht, wie es funktioniert, und sehe nicht, wie man eine Saite damit übergibt.

Mein Testcode beginnt in etwa so aus:

var moqEventAggregator = new Mock(IEventAggregator); 
var moqImportantMessage = new Mock<ImportantMessage>(); 
moqEventAggregator.Setup(x => x.GetEvent<ImportantMessage>()); 

Einige der Referenzen, die ich gesehen habe so etwas wie Rückkehr innen (eventBeingListenedTo.Object) gelten; an moqEventAggregator, nachdem Setup angewendet wurde. Ich muss natürlich .Setup (etwas) auf moqImportantMessage anwenden, um wichtigeString übergeben, aber ich sehe noch nicht genau was.

Was fehlt mir? Wie gebe ich eine Zeichenfolge mit der gefälschten veröffentlichten Nachricht weiter?

+0

nicht gerade ein Duplikat, aber Sie können wahrscheinlich übertragen diese von NSubstitute MoQ: http: // Stackoverflow.com/questions/35868184/nsubstitute-vs-prisma-eventaggregator-assert-das-aufrufen-eine-methode-trigger-even/35889556 # 35889556 – Haukinger

Antwort

0

Grundsätzlich müssen Sie 2 Dinge verspotten hier:

  1. Die Veranstaltung Aggregator
  2. Die Veranstaltung selbst

Da Sie die mock der Veranstaltung haben Sie tun müssen, wie Sie gesagt haben:

moqEventAggregator.Setup(x => x.GetEvent<ImportantMessage>()).Returns(moqImportantMessage); 

Mocking das Ereignis selbst, wie so sein sollte:

Action<string> action; 
moqImportantMessage.Setup(_ => _.Subscribe(It.IsAny<Action<string>>>())) 
    .Callback(_action => 
    { 
     action = _action; 
    }); 

Und dann können Sie das Abonnement erhöhen wie so:

action("some string"); 
+0

Ich versuche immer noch, diesen Vorschlag funktionieren zu lassen (nach Aufräumen der Syntax). Ich erhalte eine Fehlermeldung "System.NotSupportedException: Ungültige Konfiguration für ein nicht virtuelles Mitglied (überschreibbar in VB)". Ich versuche herauszufinden, wie ich es umgehen kann. – user3777273

+0

ja Entschuldigung, ich habe vergessen, dass Sie nur virtuelle Methoden vortäuschen können ... Haben Sie versucht, das echte Ereignis zurückzugeben und nicht ein Mock? –