如何在HttpSessionStateBase中正确模拟KeysCollection?

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)