如何最小化索引属性

我试图嘲笑一个索引属性的调用。 即我想moq以下内容:

object result = myDictionaryCollection["SomeKeyValue"]; 

也是制定者的价值

 myDictionaryCollection["SomeKeyValue"] = myNewValue; 

我这样做是因为我需要模拟我的应用程序使用的类的function。

有谁知道如何用最小起订量做到这一点? 我已经尝试了以下变体:

 Dictionary<string, object> MyContainer = new Dictionary<string, object>(); mock.ExpectGet<object>( p => p[It.IsAny<string>()]).Returns(MyContainer[(string s)]); 

但是这不能编译。

我试图用最小起订量来实现,有没有人有我可以做到这一点的任何例子?

目前还不清楚你想要做什么,因为你不显示模拟的声明。 你想嘲笑一本字典吗?

MyContainer[(string s)]是无效的C#。

这编译:

 var mock = new Mock<IDictionary>(); mock.SetupGet( p => p[It.IsAny<string>()]).Returns("foo"); 

灰,如果你想有HTTP会话模拟,那么这段代码做的工作:

 /// <summary> /// HTTP session mockup. /// </summary> internal sealed class HttpSessionMock : HttpSessionStateBase { private readonly Dictionary<string, object> objects = new Dictionary<string, object>(); public override object this[string name] { get { return (objects.ContainsKey(name)) ? objects[name] : null; } set { objects[name] = value; } } } /// <summary> /// Base class for all controller tests. /// </summary> public class ControllerTestSuiteBase : TestSuiteBase { private readonly HttpSessionMock sessionMock = new HttpSessionMock(); protected readonly Mock<HttpContextBase> Context = new Mock<HttpContextBase>(); protected readonly Mock<HttpSessionStateBase> Session = new Mock<HttpSessionStateBase>(); public ControllerTestSuiteBase() : base() { Context.Expect(ctx => ctx.Session).Returns(sessionMock); } } 

它并不困难,但它花了一点点find它:)

 var request = new Moq.Mock<HttpRequestBase>(); request.SetupGet(r => r["foo"]).Returns("bar"); 

正如你正确的发现,有不同的方法SetupGetSetupSet分别初始化getter和setter。 虽然SetupGet旨在用于属性,而不是索引器,并且不允许您处理传递给它的密钥。 确切地说,对于索引器, SetupGet将会调用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); ... } ... } 

为了回答你的问题,下面是一个使用底层Dictionary存储值的代码示例:

 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 vaue) => dictionary[key] = vaue); 

正如你所看到的,你必须明确指定键设置索引设置器。 在另一个SO问题中描述了细节: Moq是一个索引属性,并使用返回/callback中的索引值

看来,我正在试图用MOQ来做是不可能的。

基本上我试图MOQ一个HTTPSessiontypes的对象,其中被设置为索引的项目的关键只能在运行时确定。 访问索引属性需要返回先前设置的值。 这适用于基于整数的索引,但基于string的索引不起作用。