Reputation: 568
I'm trying to mock this list:
private readonly IList<MyClass> myList = new List<MyClass>();
using this (as seen here):
IList<MyClass> mockList = Builder<MyClass>.CreateListOfSize(5).Build();
mockObj.SetupGet<IEnumerable<MyClass>>(o => o.myList).Returns(stakeHoldersList);
However at runtime I get an InvalidCastException:
Unable to cast object of type 'System.Collections.Generic.List`1[MyClass]' to
type 'System.Collections.ObjectModel.ReadOnlyCollection`1[MyClass]'.
What am I doing wrong?
Upvotes: 2
Views: 4376
Reputation: 100547
You have a field, but trying to setup a property get.
Changing myList to property could work (not a moq expert here):
private readonly IList<MyClass> myListFiled = new List<MyClass>();
private IList<MyClass> myList {
get
{return myListFiled;}
}
Upvotes: 0
Reputation: 241651
Well, I think it's odd and frankly wrong to mock a private implementation detail. Your tests shouldn't depend on private implementation details.
But the way that I'd do this if I were you is to add a constructor:
public Foo {
private readonly IList<MyClass> myList;
public Foo(IList<MyClass> myList) { this.myList = myList; }
}
and then use Moq to mock an instance of IList<MyClass>
and pass that through the constructor.
If you don't like that suggestion, alternatively, make a virtual property:
public Foo {
private readonly IList<MyClass> myList = new MyList();
public virtual IList<MyClass> MyList { get { return this.myList; } }
}
and then use Moq to override that property.
Still, you're doing it wrong.
Upvotes: 6