2017-05-31 1 views
0

Bitte beachten Sie den Code unten:SetupGet mit mehreren Rückrufe

mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())).Callback 
      (() => mockBusinessLayer.SetupGet(y => y.FirstNumber).Returns(Helper.FirstNumber)); 
     mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())).Callback 
      (() => mockBusinessLayer.SetupGet(y => y.SecondNumber).Returns(Helper.SecondNumber)); 

berechnen() akzeptiert zwei ganzen Zahlen und fügt sie zusammen. Wie richte ich mehrere SetupGets auf demselben Mock-Objekt ein? Der obige Code richtet nur den Callback auf SecondNumber ein (weil es das letzte Mal ist, dass SetupGet aufgerufen wird).

aktualisiert

Dies ist die Funktion, die ich zu Test versuchen:

public CalculatorDTO Calculate(int NumberOne, int NumberTwo) 
     { 
       _Calculator.Calculate(NumberOne, NumberTwo); 
       return Mapper.Map<CalculatorDTO>(_changeCalculator); 
      } 
     } 

Ist es besser, dies zu tun:

mockBusinessLayer.Setup (x => x.FirstNumber) .Returns (Helfer.FirstNummer); mockBusinessLayer.Setup (x => x.SekundenZahl) .Returns (Helper.SecondNumber);

+1

Das ist von Entwurf. Moq erkennt nur das letzte Setup für ein Mitglied. Was versuchst du zu testen? – Nkosi

+0

@Nkosi, ist es möglich, mehrere einzurichten: SetupGet() – w0051977

+0

Zeigen Sie, was Sie versuchen zu testen und mal sehen, ob wir Hilfe haben, um Ihr Problem zu lösen. – Nkosi

Antwort

2

Sie sagen:

Der obige Code nur die Get-Rückruf bei Second einrichtet (weil es das letzte Mal ist SetupGet genannt wird).

Aber das ist nicht ganz richtig: Ihre Anrufe zu Setup von Calculate identisch sind und somit der zweite überschreibt die erste. Es ist, als ob die erste Setup nie aufgetreten ist.

Die Aufrufe von SetupGet in Callback ist unnötig und verwirrend. Ich würde es gesetzt wie auf den Punkt:

mockBusinessLayer.SetupGet(y => y.FirstNumber).Returns(Helper.FirstNumber) 
mockBusinessLayer.SetupGet(y => y.SecondNumber).Returns(Helper.SecondNumber) 
mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())); 

Jedes Mal FirstNumber bekommen, wird es Helper.FirstNumber zurückkehren und ebenfalls für SecondNumberHelper.SecondNumber zurück.


, dass alle gesagt wird, ohne mehr von Ihrem Code (Welche _Calculator ist? Hat Ihr mockBusinessLayer wirklich FirstNumber/SecondNumberundCalculate aussetzen?) Es ist schwer, vollständigere Schritte zu bieten vorwärts zu bewegen. Zum Beispiel zeigen Sie nicht die Einrichtung Ihrer Mapper.Map Methode, die Sie benötigen, wenn Sie diese Methode testen möchten.


Als Reaktion auf das Update ...

SetupGet bietet eine etwas sauberere API: Sie Func passieren sind erforderlich, während Setup ermöglicht es Ihnen, eine Action zu passieren; es gibt eine etwas eingeschränktere ISetupGet Schnittstelle zurück. SetupGet hat auch eine bessere Semantik, die den Lesern anzeigt, dass Sie beabsichtigen, nur das Get einzurichten.

In der Moq Quelle sie tatsächlich auf den gleichen Code kochen, so entweder die Arbeit genauso gut erledigen.

+0

danke. Was ist der Vorteil der Verwendung von SetupGet über Setup? (Bitte beachten Sie das Update in meiner Frage). – w0051977

+0

@ w0051977 Siehe Update –

+0

Danke für das Update. Schließlich sagt Kenneth K in seinem Kommentar (unter meinem OP): "Richte alles zu Beginn ein". Haben Sie das hier gemacht oder gibt es einen "besseren" Weg? Danke noch einmal. – w0051977