2

私はこのリストをモックしようとしています:

private readonly IList<MyClass> myList = new List<MyClass>();

これを使用して(ここに見られるように):

IList<MyClass> mockList = Builder<MyClass>.CreateListOfSize(5).Build();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.myList).Returns(stakeHoldersList);

ただし、実行時に InvalidCastException が発生します。

Unable to cast object of type 'System.Collections.Generic.List`1[MyClass]' to
type 'System.Collections.ObjectModel.ReadOnlyCollection`1[MyClass]'.

私は何を間違っていますか?

4

2 に答える 2

6

個人的な実装の詳細を嘲笑するのは奇妙で率直に言って間違っていると思います。テストは、非公開の実装の詳細に依存するべきではありません。

しかし、私があなただったら、コンストラクターを追加することでこれを行います。

public Foo {
    private readonly IList<MyClass> myList;
    public Foo(IList<MyClass> myList) { this.myList = myList; }
}

次に、Moq を使用してインスタンスをモックし、それIList<MyClass>をコンストラクターに渡します。

その提案が気に入らない場合は、代わりに仮想プロパティを作成します。

public Foo {
    private readonly IList<MyClass> myList = new MyList();
    public virtual IList<MyClass> MyList { get { return this.myList; } }
}

次に、Moq を使用してそのプロパティをオーバーライドします。

それでも、あなたはそれを間違っています。

于 2012-04-17T19:33:09.093 に答える
0

フィールドがありますが、プロパティ get を設定しようとしています。

myList をプロパティに変更するとうまくいく可能性あります (ここでは moq の専門家ではありません):

private readonly IList<MyClass> myListFiled = new List<MyClass>();
private IList<MyClass> myList {
  get 
   {return myListFiled;}
}
于 2012-04-17T19:35:24.693 に答える