2016-05-25 11 views
-1

Ich habe den folgenden Komponententest.Weitere anpassen Rückgabewert mit MOQ

[TestMethod]  
    public void IfTheSecondPaymentFailsThenTheFirstPaymentShouldBeVoided() 
    { 
     var iPaymentMock = new Mock<IPaymentMock>(); 
     var paymentSpecificationResponse = new PreregisteredAccountSpec(); 
     iPaymentMock.Setup(
       counter => counter.ProcessPayment 
        (
         It.IsAny<Context>(), 
         It.IsAny<PreregisteredAccountSpec>(), 
         It.IsAny<Guid>()) 
        ). 
       Returns((Context context, PaymentSpecification spec, Guid guid) => 
       { 
        return paymentSpecificationResponse; 
       } 
       ); 
    } 

Wie kann ich den Test ändern paymentSpecificationResponse.Distributions zurückzukehren [0] .Transaction.GetVendorId() als "1", wenn das Distributions-Array nur gelesen wird.

Antwort

1

Wenn ich richtig verstanden habe, möchten Sie den Schein-Rückgabewert basierend auf den Parametern ändern, die an ihn übergeben werden. Sie können eine Überladung von .Returns() verwenden und eine Funktion bereitstellen.

.Returns((context, spec, guid) => { //Do something with the arguments passed to the mock }) 
+0

Ich denke, meine Frage hätte sein sollen: Wie sollte ich die paymentSpecificationResponse ändern, wenn ich paymentSpecificationResponse.Distributions [0] nicht "setzen" kann? Die paymentSpecificationResponse ist Teil einer Drittanbieter-DLL. –

+0

Ich verstehe jetzt. Leider ist es schwierig, eine endgültige Antwort zu geben, ohne die Kurse von Dritten zu sehen. Gibt es eine 'SetVendorId()' Funktion, die Sie aufrufen können? Können Sie '.Transaction' auf einen Schein setzen? – mdickin

+0

Tatsächlich verfügten sie über eine AddDistribution-Methode, um eine Verteilung hinzuzufügen. Das Erstellen einer gültigen Distribution und das Hinzufügen mit der AddDistribution-Methode funktionierte für mich. –