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);
プロパティ値を設定すると、以下のエラーが発生します。私は何か間違ったことをしていますか? Moqの具象クラスができないように見えますか?モックできるのはインターフェイスのみですか?手伝ってください。
ありがとう、アブドゥル
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 };
何かをあざけるかどうかはどうやって決めるのですか?一般的に言えば、具体的なランタイム実装をテストに含めたくない場合は、モックを作成します。同時に両方ではなく1つのクラスをテストしたい。
ただし、この場合PagingOptions
は、データを保持するクラスにすぎません。それをあざける意味は本当にありません。実物と同じくらい簡単に使用できます。