メソッドに渡された戻り値


391

インターフェイスにメソッドがあります:

string DoSomething(string whatever);

これをMOQでモックして、渡されたものをすべて返すようにしたい-次のようなもの:

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

何か案は?

回答:


527

次のように、入力パラメーターでラムダを使用できます。

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

または少し読みやすい:

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

1
7つの引数を持つメソッドに対してこれを行う必要があるまでは、非常に簡単に思えます ... IReturnsMoqで検査すると、最大で4つの引数Returnsに対して定義されます。それを回避する簡単な方法はありますか?/ Moqソースの変更を除いて意味します/
mizuki nakeshu

14
わかりました、それはvの最大9つの引数に対して定義されています。解決しました:)Moq4.0.0.0
mizuki nakeshu 2013年

14
@mizukinakeshuクラス/メソッドの処理が多すぎるように聞こえるので、9引数メソッドのリファクタリングを少し検討します。おそらく、後で役立つように、9つのパラメーターを設定クラスまたは構造体にリファクタリングしますか?
上院議員

@TheSenator同意する、私はこれが何であったかをまだ思い出しませんが、私が変更していない既存のコードに対していくつかの単体テストを一緒にハッキングしていたと思います。
mizuki nakeshu 2015

27
これが私を混乱させたメモです:inの文字列.Returns<string>は入力パラメーターを参照し、返される値を参照しません。
ジム

241

さらに便利なのは、複数のパラメーターがある場合、次のようにしてそれらのいずれか/すべてにアクセスできることです。

_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));

メソッドのシグネチャを一致させるために、常に1つの引数のみを使用する場合でも、すべての引数を参照する必要があります。


17
これは受け入れられる答えになるはずです。これがまさにあなたがしなければならないことです。それ以外のものは、「予期される引数の数」例外をスローします。
Chaim Eliyah 2015

ええ、間違いなく読みやすく、動作しReturnsAsyncます!
Piotr Kula 2017

1
この答えはその日を救った。注(将来の読者)、少し先に進むこともできます。.Returns((string a、string b、string c)=> {string d = "wow"; return string.Concat(a、b、c、d);});
granadaCoder 2017

1
個人的には、これははるかに良い答えです。Moqについての知識はほとんどありませんが、それでもすぐに理解しました。
unrealsoul007

voidを返すメソッドの場合、.Callback((string a、Exception b、string c)=> throw new Exception(b.Message));を使用しました。
ティムタム

62

ジェネリックReturns<T>メソッドは、この状況を適切に処理できます。

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

または、メソッドに複数の入力が必要な場合は、次のように指定します。

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.