2017-08-15 1 views
1

Ich versuche Untitest einen Methodenaufruf, der darauf wartet, dass ein Thread einen bestimmten Wert erhält. Der Thread fragt mehrmals pro Sekunde von einer Schnittstelle ab, und wenn keine Informationen dafür vorhanden sind, erhält er eine Standardnachricht vom Typ 0. Wenn der Thread jedoch einen bestimmten Nachrichtentyp über 0 empfängt, reagiert er darauf. In meinem Fall bricht ein bestimmter Wert die Wartezeit und die Methode gibt ein Ergebnis zurück. Aber wie stelle ich das mit Moq auf?Setup Moq, um den Standardwert mehrere Male zurückzugeben, bis es einen bestimmten Wert zurückgeben sollte

Bei dieser Frage geht es nicht darum, eine bekannte Sequenz zurückzugeben, sondern um eine Unbekannte kontinuierliche Sequenz zurückzugeben, bis ein bekannter Wert erwartet wird.

Hier ist, was ich bisher habe:

 mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
      () => 
      { 
       CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1}); 
      }).Verifiable(); 
     mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 

ich ein Testsystem aufbauen für Nachrichten genannt CallbackMessageService zu schaffen. Wenn die Fassade facade.GetCallbackMessage (2. Setup) aufruft, wird standardmäßig eine Nachricht vom Typ 0 zurückgegeben. Während des Tests kann ich dann meinen CallbackMessageService aufrufen und über CallbackMessageService.AddMessage (1. Setup) eine Nachricht hinzufügen. Beim nächsten Aufruf von facade.GetCallbackMessage() gibt das System diese spezifische Nachricht zurück.

Der CallbackMessageService funktioniert, aber das Problem besteht darin, dass das Setup für GetCallbackMessage (2. Setup) die erste Nachricht, die es von dem CallbackMessageService empfängt, irgendwie zwischenspeichert. Es gibt dann immer die zwischengespeicherte Nachricht zurück und der CallbackMessageService.GetNextMessage() wird nie erneut aufgerufen. Ich muss es einrichten, damit CallbackMessageService.GetNextMessage() immer aufgerufen wird, wenn facade.GetCallbackMessage() ist.

Wie erreiche ich das mit Moq?

Ich nehme an, das Zwischenspeichern ist eine Standard-Sache in Moq und ich weiß über die SetupSequenz. Das Problem ist, ich habe keine Kontrolle darüber, wie viele Standardwerte ich behandeln muss, bevor der spezifische Wert zurückgegeben werden soll.

Ich entfernte etwas Code, um das Problem zu isolieren. Bitte lassen Sie mich wissen, wenn es zu wenig Kontext gibt.

+0

Mögliches Duplikat von [Verschiedene Rückgabewerte das erste und zweite Mal mit Moq] (https://stackoverflow.com/questions/7287540/difference-return-values-the-first-and-second-time-with-moq) – krillgar

+0

@krillgar Ich verstehe, dass dies wie ein Duplikat dieser Art von Frage aussieht, aber diese Frage kennt immer ihre genaue Struktur der Rückkehr, während in meinem Fall ich nicht. Ich kann 0 bis unbegrenzte Standardtypen erhalten, bevor ich den spezifischen Typ zurückgeben muss. – evilfish

Antwort

0

Nachdem ich die Frage gepostet habe, habe ich weiter mit dem Code herumgebastelt und eine Lösung gefunden. Diese Lösung funktioniert nur, weil das System, das ich test, eine andere Methode namens facade.CallbackMessageProcessed auf der Schnittstelle aufruft, bevor es die facade.GetCallbackMessage() erneut aufruft. Das konnte ich zu meinem Vorteil nutzen etwa so:

mockedFacade.Setup(facade => facade.RequestPayment()).Callback(
    () => 
    { 
     CallbackMessageService.AddMessage(new CallbackMessage{Type = 2, Value = 1, MessageID = Guid.NewGuid().ToString()}); 
    }).Verifiable(); 
mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 
mockedFacade.Setup(facade => facade.CallbackMessageProcessed(It.IsAny<CallbackMessage>())).Callback(
    (CallbackMessage c) => 
    { 
     CallbackMessageService.MessageResolved(c); 
     mockedFacade.Setup(facade => facade.GetCallbackMessage()).Returns(CallbackMessageService.GetNextMessage()); 
    }); 

Jedes Mal, wenn die CallbackMessageProcessed i schaffen wieder ein genannt genannt wird, wo ich das Setup wiederholen. Dies setzt die Schleife fort, bis der Test abgeschlossen ist. Es ist also eine Möglichkeit, dieses Problem zu lösen.

Ich habe auch versucht, die Einrichtung in meiner facade.GetCallbackMessage() Callback, aber das hat nicht funktioniert.

Während dies eine Antwort auf meinen speziellen Fall ist, wäre es schön zu sehen, ob es eine Möglichkeit gibt, mehrere unbekannte Menge von Renditen auf einem Setup in Moq zu erlauben, bevor eine andere Rückkehr erwartet wird, wenn Sie keine Sekunde haben Methode wie ich es getan habe.

+0

Da ich nichts Neues gehört habe, werde ich diese Frage schließen – evilfish

Verwandte Themen