Mocking indexed property

2020-08-24 12:11发布

问题:

I am writing unit tests using Moq. I have created a mock object. Now when i try to mock its property i am getting error "An expression tree may not contain an indexed property"

here is my code.

public Node GetNode(IMyInterface interface, string itemName)
{
    return interface.Items[itemName];
}

Here is the unit test

var expected = new Node();
var itemName = "TestName";
var mock = new Mock<IMyInterface>();
mock.Setup(f => f.Items[itemName]).Returns(expected);
var target = new MyClass();

var actual = target.GetNode(mock.Object, itemName);
Assert.AreEqual(expected, actual);

This line is giving me error.

mock.Setup(f => f.Items[itemName]).Returns(expected);

How can i moq this function.

回答1:

Interface was a COM object and there were get function, so instead of directly accessing property using indexer use get function,

mock.Setup(f => f.get_Items(itemName)).Returns(expected); 


回答2:

Using Moq in ASP.NET Core 2.2, the get_Items setup does not work. But this does:

Mock<IConfiguration> configuration = new Mock<IConfiguration>();
configuration.Setup(x => x[key]).Returns(value);