A medida que ha detectado correctamente, hay métodos distintos SetupGet
y SetupSet
para inicializar captadores y definidores, respectivamente. Aunque SetupGet
está destinado a ser utilizado para propiedades, no para indexadores, y no le permitirá manejar la clave que se le pasa. Para ser precisos, los indexadores SetupGet
llamarán de Setup
todos modos:
internal static MethodCallReturn<T, TProperty> SetupGet<T, TProperty>(Mock<T> mock, Expression<Func<T, TProperty>> expression, Condition condition) where T : class
{
return PexProtector.Invoke<MethodCallReturn<T, TProperty>>((Func<MethodCallReturn<T, TProperty>>) (() =>
{
if (ExpressionExtensions.IsPropertyIndexer((LambdaExpression) expression))
return Mock.Setup<T, TProperty>(mock, expression, condition);
...
}
...
}
Para responder a su pregunta, aquí hay una muestra de código que usa subyacente Dictionary
para almacenar valores:
var dictionary = new Dictionary<string, object>();
var applicationSettingsBaseMock = new Mock<SettingsBase>();
applicationSettingsBaseMock
.Setup(sb => sb[It.IsAny<string>()])
.Returns((string key) => dictionary[key]);
applicationSettingsBaseMock
.SetupSet(sb => sb["Expected Key"] = It.IsAny<object>())
.Callback((string key, object value) => dictionary[key] = value);
Como puede ver, debe especificar explícitamente la clave para configurar el definidor del indexador. Los detalles se describen en otra pregunta SO: Moq una propiedad indexada y use el valor del índice en la devolución / devolución de llamada