I’m having trouble figuring out how to set indexers in C# with Moq. The Moq documentation is weak, and I’ve done a lot of searching… what I’d like to do is similar in the solution to How to Moq Setting an Indexed property:
var someClass = new Mock<ISomeClass>();
someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);
I want to modify the above to work for any index and any value so I can just do something like this:
someClass.Object.SomeIndexedProperty[1] = 5;
Currently I have the following, which works great for the indexed property getter, but if I ever set the value Moq ignores it:
var someValues = new int[] { 10, 20, 30, 40 };
var someClass = new Mock<ISomeClass>();
someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()])
.Returns<int>(index => someValues[index]);
// Moq doesn't set the value below, so the Assert fails!
someClass.Object.SomeIndexedProperty[3] = 25;
Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);
I found a solution to my problem. It requires a shift in my thinking… I had been looking to use NUnit’s
Assertto verify that the indexer setter in mysomeClassmock was being called with the correct value.It seems that with Moq the supported way to do this is to use the
VerifySetfunction. A contrived example:The unit test passes since
SomeIndexedProperty[3]is set to 25, but would fail otherwise.