[解決済み] Moq - オーバーライド不可能なメンバをセットアップ/検証式で使用することはできません。
2023-06-10 09:09:32
質問
Moqを使い始めたばかりです。をモックしています。
PagingOptions
クラスをモックしています。以下は、クラスがどのように見えるかです。
public class PagingOptions
{
[Range(1, 99999, ErrorMessage = "Offset must be greater than 0.")]
public int? Offset { get; set; }
[Range(1, 100, ErrorMessage = "Limit must be greater than 0 and less than 100.")]
public int? Limit { get; set; }
public PagingOptions Replace(PagingOptions newer)
{
return new PagingOptions
{
Offset = newer.Offset ?? Offset,
Limit = newer.Limit ?? Limit
};
}
}
以下は、私のモック版のクラスです。
var mockPagingOptions = new Mock<PagingOptions>();
mockPagingOptions.Setup(po => po.Limit).Returns(25);
mockPagingOptions.Setup(po => po.Offset).Returns(0);
プロパティ値を設定する際に、以下のようなエラーが発生します。私が何か間違ったものを作っているのでしょうか。コンクリートクラスはモックできないようですが?モックできるのはインターフェイスだけですか? よろしくお願いします。
ありがとうございます。 Abdul
どのように解決するのですか?
Moqはモックされた型の実装を作成します。型がインターフェースの場合、そのインターフェースを実装したクラスを作成します。クラスであれば、継承クラスを作成し、その継承クラスのメンバが基底クラスを呼び出します。しかし、そのためにはメンバをオーバーライドする必要があります。もしクラスにオーバーライドできないメンバー(仮想、抽象でない)がある場合、Moqはそれらをオーバーライドして独自の動作を追加することができません。
この場合、モックする必要はありません。
PagingOptions
を使うのは簡単だからです。そのかわり、このように
var mockPagingOptions = new Mock<PagingOptions>();
mockPagingOptions.Setup(po => po.Limit).Returns(25);
mockPagingOptions.Setup(po => po.Offset).Returns(0);
これを実行します。
var pagingOptions = new PagingOptions { Limit = 25, Offset = 0 };
モックを作成するかどうかは、どのように判断すればよいのでしょうか。一般的には、具体的な実行時実装をテストに含めたくない場合にモックを使用します。同時に2つのクラスをテストするのではなく、1つのクラスをテストしたいのです。
しかし、この場合
PagingOptions
は単にデータを保持するクラスです。これをモック化する意味はありません。本物を使う方が簡単です。
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み] Invalid setup on a non-virtual (overridable in VB) member..." というメッセージのExceptionが発生するのはなぜですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] いつモックすればいい?