【发布时间】:2012-11-08 09:08:36
【问题描述】:
我在此处的示例中设置了这个模拟会话对象:How to MOQ an Indexed property
/// <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; }
}
}
一些产生错误的示例代码...
var mockSession = new HttpSessionMock();
var keys = mockSession.Keys;
错误:方法或操作未实现。
我需要实现 Keys 属性,但无法创建 KeysCollection 对象。
最好的方法是什么?
编辑:[解决方案]
我最终根据给出的答案更改了 HttpSessionMock。这就是我最终的结果。 (我还添加了对 System.Linq 的引用)。
internal sealed class HttpSessionMock : HttpSessionStateBase
{
private readonly NameValueCollection objects = new NameValueCollection();
public override object this[string name]
{
get { return (objects.AllKeys.Contains(name)) ? objects[name] : null; }
set { objects[name] = (string)value; }
}
public override NameObjectCollectionBase.KeysCollection Keys
{
get { return objects.Keys; }
}
}
注意:这个模拟会话将只存储字符串,而不是对象。
【问题讨论】:
-
虽然代码来自一个 Moq 问题,但该解决方案不使用 Moq 库。我建议删除 Moq 标签。
-
当我尝试在其中塞入一个 bool 时,这个 mock/fake 会爆炸。我在这里找到了适用于此的代码 sn-p:stackoverflow.com/questions/524457/…
标签: c# unit-testing asp.net-mvc-3 session