Wie Sie richtig entdeckt, gibt es verschiedene Methoden SetupGet
und SetupSet
jeweils Getter und Setter zu initialisieren. Obwohl SetupGet
fü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 SetupGet
anrufen 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 Dictionary
Wert 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