552 Stimmen

Rückgabe eines Wertes, der an eine Methode übergeben wurde

Ich habe eine Methode auf einer Schnittstelle:

string DoSomething(string whatever);

Ich möchte diese mit MOQ spiegeln, so dass es zurückgibt, was in übergeben wurde - etwas wie:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

Irgendwelche Ideen?

751voto

mhamrah Punkte 8258

Sie können ein Lambda mit einem Eingabeparameter verwenden, etwa so:

.Returns((string myval) => { return myval; });

Oder etwas besser lesbar:

.Returns<string>(x => x);

1 Stimmen

Es scheint recht einfach zu sein, bis man dies für eine Methode mit 7 Argumente ... Als ich inspizierte IReturns in Moq, definiert es Returns para Höchstens 4 Argumente . Gibt es eine einfache Möglichkeit, das zu umgehen? /(Ich meine, außer die Moq-Quelle zu ändern)

18 Stimmen

Ok, es ist definiert für bis zu 9 Argumente en Moq v 4.0.0.0 . gelöst :)

21 Stimmen

@mizukinakeshu Ich würde ein bisschen ein Refactor auf einem 9 Argument Methode, wie es klingt wie die Klasse/Methode ist zu viel zu tun betrachten. Vielleicht refactor die 9 Parameter in eine Einstellungen Klasse oder Struktur, um Ihnen später zu helfen?

387voto

Steve Punkte 3855

Noch nützlicher ist es, wenn Sie mehrere Parameter haben, auf die Sie mit jedem/jeder von ihnen zugreifen können:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

Sie müssen immer auf alle Argumente verweisen, um der Signatur der Methode zu entsprechen, auch wenn Sie nur eines von ihnen verwenden werden.

24 Stimmen

Dies sollte die akzeptierte Antwort sein. Das ist genau das, was Sie tun müssen. Alles andere führt zu einer "Anzahl der erwarteten Argumente"-Ausnahme.

0 Stimmen

Ja, auf jeden Fall viel einfacher zu lesen und zu arbeiten ReturnsAsync auch!

2 Stimmen

Diese Antwort hat den Tag gerettet. Hinweis (für künftige Leser): Sie können auch noch ein bisschen weiter gehen. .Returns((string a, string b, string c) => { string d = "wow"; return string.Concat(a,b,c,d); } );

96voto

William Punkte 7758

Das generische Returns<T> Methode kann diese Situation sehr gut bewältigen.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

Oder wenn die Methode mehrere Eingaben erfordert, geben Sie sie so an:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);

1voto

Adrián Alvarez Punkte 173

Für diejenigen, die Moq nicht verwenden, gibt es eine Möglichkeit mit NSubstitute.

mock.Method(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).Returns(callInfo =>
    {
         var arg1 = callInfo[0].ToString();
         var arg2 = callInfo[1].ToString();
         var argN = callInfo[n-1].ToString();
         return arg1 + arg2 + argN; //or whatever
    });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X