3

Itemstypeのプロパティを含むオブジェクトをモックしようとすると、問題が発生しますICollection<>。次のエラーが表示されます。

System.NotSupportedException : 非仮想 (VB でオーバーライド可能) メンバーの設定が無効です: m => m.Items

問題は、プロパティItems が既に virtualであることです。

以下のサンドボックスで、プロジェクトで発生したエラーを再現しました。

public class ItemList
{
    public virtual int Id { get; set; }
}

public class SpecialList
{
    public virtual string Token { get; internal set; }
    public virtual ICollection<ItemList> Items { get; private set; }
}

私がそれを好きにしようとすると、私のテストでそのエラーが発生しますSetupProperty:

[TestFixture]
public class TestSpecialList
{
    [Test]
    public void Mocking_Virtual_ICollection()
    {
        var mockModel = new Mock<SpecialList>();
        var listItem = new List<ItemList> {new ItemList {Id = 007}};

        mockModel.SetupProperty(m => m.Items, listItem);
    }
}

私は何か間違ったことをしていますか?ICollection<> プロパティを含むオブジェクトを Moq することは可能ですか?

4

1 に答える 1

5

次のいずれかを使用してみてください。

mockModel.Setup(m => m.Items).Returns(listItem);
mockModel.SetupGet(m => m.Items).Returns(listItem);

このメソッドSetupPropertyは、その値を追跡する場合に使用されます。 moq wikiを参照してください。なぜSetupProperty失敗するのかはよくわかりませんが、プロパティ値を取得して取得できるようにすることを目的としているため、private get が原因である可能性が高いと思われます。

明確にするために、プロパティにパブリック セットがあると仮定しましょう。その場合、Setupまたはを使用すると、次のSetupGetようなmockModel.Object.Items = new List<ItemList>();ことを行っても効果がなく、単一の項目のリストが表示されます。ただしSetupProperty、同じステートメントを使用すると、プロパティによって返される値が変更されます。

基本的SetupPropertyに、プロパティの値を取得および設定できるため、プライベート セットでは使用できないと思います。

于 2013-06-07T16:02:29.223 に答える