joe*_*net 8 c# session unit-testing asp.net-mvc-3
我从这里的示例设置了这个模拟会话对象:如何MOQ索引属性
/// <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; }
}
}
Run Code Online (Sandbox Code Playgroud)
一些示例代码产生错误...
var mockSession = new HttpSessionMock();
var keys = mockSession.Keys;
Run Code Online (Sandbox Code Playgroud)
错误:未实现方法或操作.
我需要实现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; }
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这个模拟会话只存储字符串,而不是对象.
scd*_*ove 16
我发现原始方法和接受的解决方案的组合允许存储对象和实现keys属性:
public class HttpSessionMock : HttpSessionStateBase
{
private readonly NameValueCollection keyCollection = new NameValueCollection();
private readonly Dictionary<string, object> objects = new Dictionary<string, object>();
public override object this[string name]
{
get
{
object result = null;
if (objects.ContainsKey(name))
{
result = objects[name];
}
return result;
}
set
{
objects[name] = value;
keyCollection[name] = null;
}
}
public override NameObjectCollectionBase.KeysCollection Keys
{
get { return keyCollection.Keys; }
}
}
Run Code Online (Sandbox Code Playgroud)