我正在尝试模拟HttpRequestBase
和HttpSessionStateBase
对象,并使用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。
答案 0 :(得分:0)
调用_httpSessionStateBase.Object["MotorSession"] = _motorWebSession;
而不是_httpSessionStateBase.Setup( s => s["MotorSession"]).Returns(_motorWebSession);
。 Moq模拟对象即使使用[]
运算符也无法通过索引直接分配。正确的方法是进行设置。