1

この ReadOnlyCollection プロパティをモックしようとしています:

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

このモックを使用して (ここで見られるように):

IList<MyClass> mockList = GetElements();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.myList).Returns(mockList);

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

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

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

4

3 に答える 3

2

コードが実際に次のようになっているとします (そうでない場合はコンパイルされません)。

// Arrange
IList<MyClass> stakeHoldersList= GetElements();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.MyList).Returns(stakeHoldersList);
// Act on SUT which uses mockObj

タイプ MyList のプロパティReadOnlyCollection<MyClass>がありますが、返そうとしていますIEnumerable<MyClass>。そのため、そのエラーが発生します。したがって、次のように変更します。

ReadOnlyCollection<MyClass> stakeHoldersList = new ReadOnlyCollection<MyClass>(GetElements());
mockObj.SetupGet<ReadOnlyCollection<MyClass>>(o => o.MyList).Returns(stakeHoldersList);

このような実行時エラーを回避するには、SetupGet メソッドのタイプを指定しないでください。この場合、戻り値の型はプロパティの型から推測され、すぐにエラーが発生します (戻り値の型がプロパティの型と一致しない場合、コードはコンパイルされません)。

mockObj.SetupGet(o => o.MyList).Returns(stakeHoldersList);
于 2012-04-17T21:52:38.687 に答える
1

private readonly property をモックすることはできません。パブリック プロパティは virtual とマークされているため、myListオーバーライドすることができます。MyListそのためには、次のコードを更新する必要があります。

IList<MyClass> mockList = GetElements();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.myList).Returns(mockList);

これに:

var mockList = new ReadOnlyCollection<MyClass>(GetElements());
mockObj.Setup(o => o.MyList).Returns(mockList);
于 2012-04-17T21:47:38.970 に答える