[解決済み] オプションの引数を明示的に指定したりオーバーロードを使用せずに、シグネチャにオプションの引数を持つメソッドをMoqするにはどうすればよいですか?
質問
次のようなインターフェイスがあるとします。
public interface IFoo
{
bool Foo(string a, bool b = false);
}
Moqを使ってモックを試みる。
var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);
はコンパイル時に以下のようなエラーを出します。
式木はオプションの引数を使用する呼び出しまたは呼び出しを含むことができません。
私は、上記の問題提起を の強化 として提起された上記の問題を Moq の課題リストで見つけ、それは 4.5 リリース (それがいつであれ) に割り当てられているようです。
私の質問は、上記がすぐに修正されそうにないことを考えると、私はどうしたらよいでしょうか。私の選択肢は、モックするたびにオプション パラメーターのデフォルト値を明示的に設定する (これは、最初の場所で 1 つを指定するポイントを打ち消すようなものです) か、bool のないオーバーロードを作成する (C# 4 以前なら行っていたように) ことのみでしょうか?
または、この問題を克服するためのより巧妙な方法に出会ったことがありますか?
どのように解決するのですか?
今のところ、唯一の選択肢は、明示的に
bool
のセットアップで
Foo
.
デフォルト値を指定する目的は破たんしていないと思います。デフォルト値はコードを呼び出すための便宜的なものですが、テストでは明示的に指定するべきだと思うのです。例えば
bool
パラメータを指定しないとします。のデフォルト値を変更した場合、どうなるでしょうか?
b
を
true
? これはテストの失敗を招きますが(そしてそれは当然です)、以下のような隠された前提があるため、修正がより困難になります。
b
は
false
. を明示的に指定することで
bool
パラメータを明示的に指定することで、テストの可読性を高めることができます。テストの読みやすさが向上します。
Foo
関数があることがすぐにわかるでしょう。これが、少なくとも私の2セントです :)
モックを作るたびにそれを指定することについては、コードを重複させないことです:モックを関数の中で作成または初期化し、変更のポイントが1つになるようにします。本当にそうしたいのであれば、Moq の明らかな欠点を克服するために
Foo
のパラメータをこの初期化関数に複製します。
public void InitFooFuncOnFooMock(Mock<IFoo> fooMock, string a, bool b = false)
{
if(!b)
{
fooMock.Setup(mock => mock.Foo(a, b)).Returns(false);
}
else
{
...
}
}
関連
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み] Mockitoを使用して特定のメソッドが呼び出されていないことを確認するにはどうすればよいですか?
-
[解決済み] Moqでメソッドが呼び出されていないことを確認する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。