How to mock a private readonly IList<T> property using moq

c#, moq, nbuilder

Solution

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.

Problem

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?

Original source

Related problems