MoQ在HttpSessionStateBase上查询的位置

时间:2018-10-22 10:03:58

标签: c# moq

我正在尝试模拟HttpRequestBaseHttpSessionStateBase对象,并使用Moq模拟框架测试我的代码。

这是我设置的相关部分。

_httpSessionStateBase = _mockRepository.Create<HttpSessionStateBase>();
            _motorWebSession = new MotorWebSession
            {
                PersonaIdentifier = Guid.NewGuid(),
                NameIdentifier = Guid.NewGuid(),
                MiCurrentPageId = Guid.NewGuid(),
                MiSessionId = Guid.NewGuid(),
            };

            _httpSessionStateBase.SetupGet(e => e.Count).Returns(1);
            var keysCollection = new NameValueCollection { { "MotorSession", "MotorSession" } };
            _httpSessionStateBase.SetupGet(e => e.Keys).Returns(keysCollection.Keys);
            _httpSessionStateBase.Object[0] = _motorWebSession;
            _httpSessionStateBase.Object["MotorSession"] = _motorWebSession;

_httpContextBase = _mockRepository.Create<HttpContextBase>();
_httpContextBase.SetupGet(h => h.Session).Returns(_httpSessionStateBase.Object);

在当前的实现中,此代码在测试中被调用。

var webSession = _httpContext.Current.Session;

var sessionObject = webSession.Keys.Cast<string>()
                    .Where(w => webSession[w] is WebSessionBase)
                    .Select(s => webSession[s])
                    .ToList().FirstOrDefault();

在Where子句sessionObject期间产生的结果null阻止了其他任何后续代码正常运行。我在安装程序时出现问题吗?还是可以更改代码以使其适用于此设置?它与Rhino.Mocks配合使用,但我正尝试将其更改为Moq。

1 个答案:

答案 0 :(得分:0)

调用_httpSessionStateBase.Object["MotorSession"] = _motorWebSession;而不是_httpSessionStateBase.Setup( s => s["MotorSession"]).Returns(_motorWebSession);。 Moq模拟对象即使使用[]运算符也无法通过索引直接分配。正确的方法是进行设置。