web-dev-qa-db-ja.com

Moq-オーバーライドできないメンバーは、セットアップ/検証式で使用できません

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 error

ありがとう、アブドゥル

20
fingers10

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は、データを保持するクラスにすぎません。それをあざける意味は本当にありません。実物と同じくらい簡単に使用できます。

38
Scott Hannen