Wie Sie richtig entdeckt, gibt es verschiedene Methoden SetupGetund SetupSetjeweils Getter und Setter zu initialisieren. Obwohl SetupGetfür Eigenschaften und nicht für Indexer vorgesehen ist und Sie keine an ihn übergebenen Schlüssel verarbeiten können. Um genau zu sein, werden Indexer trotzdem SetupGetanrufen Setup:
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);
...
}
...
}
Um Ihre Frage zu beantworten, finden Sie hier ein Codebeispiel mit dem zugrunde liegenden DictionaryWert zum Speichern von Werten:
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);
Wie Sie sehen können, müssen Sie den Schlüssel explizit angeben, um den Indexer-Setter einzurichten. Details werden in einer anderen SO-Frage beschrieben: Moq eine indizierte Eigenschaft und verwenden Sie den Indexwert in der Rückgabe / Rückruf