Мне это не нравится, но я смог обойти это, используя новый класс наследования.
Затем я перезаписываю индексатор и вызываю виртуальный метод, который можно смоделировать.
public class HttpSessionStateBaseProxy : HttpSessionStateBase
{
public virtual void SetItem(string key, object value)
{
base[key] = value;
}
public override object this[string name]
{
get
{
return base[name];
}
set
{
SetItem (name, value);
}
}
}
и насмешка выполняется:
Mock<HttpSessionStateBaseProxy> Session = new Mock<HttpSessionStateBaseProxy>(MockBehavior.Loose);
Session.CallBase = true;
Session.Setup(x => x.SetItem(It.IsAny<string>(),It.IsAny<object>()))
.Callback<string,object>((string index, object value) =>
{
if (!this.SessionItems.Contains(index)) this.SessionItems.Add(index, value);
else this.SessionItems[index] = value;
});
Session.Setup(s => s[It.IsAny<string>()]).Returns<string>(key =>
{
return this.SessionItems[key];
});