C# 单元测试:使用Moq设置读/写会话变量
我有一个函数,它基于一些内部逻辑,将重定向字符串存储在会话变量(redirect_To)中。我正在尝试编写一个单元测试,一旦调用的操作完成,它将检查这个会话变量的值 我使用Moq来模拟我的一些属性和函数。但是,每当我使用Moq设置会话变量(Redirect_To)时,它必须将其设置为只读,因为我不能再为它赋值,这会导致单元测试失败 下面是我的单元测试:C# 单元测试:使用Moq设置读/写会话变量,c#,asp.net-mvc,unit-testing,session,moq,C#,Asp.net Mvc,Unit Testing,Session,Moq,我有一个函数,它基于一些内部逻辑,将重定向字符串存储在会话变量(redirect_To)中。我正在尝试编写一个单元测试,一旦调用的操作完成,它将检查这个会话变量的值 我使用Moq来模拟我的一些属性和函数。但是,每当我使用Moq设置会话变量(Redirect_To)时,它必须将其设置为只读,因为我不能再为它赋值,这会导致单元测试失败 下面是我的单元测试: public async Task Index_ClientTypeIsRPI_ExpectCorrectRedirect() {
public async Task Index_ClientTypeIsRPI_ExpectCorrectRedirect()
{
var sessionDict = new Dictionary<string, string>
{
{"CID", "124" },
{"UserName", "AK92630" },
{"REDIRECT_TO", "www.google.com" }
};
var controllerContext = HttpContextManager.ReturnMockControllerContextWithSessionVars(sessionDict);
var mockIdentity = new Mock<IIdentity>();
mockIdentity.Setup(x => x.Name).Returns("TestName");
controllerContext.Setup(x => x.HttpContext.User.Identity).Returns(mockIdentity.Object);
controllerContext.Setup(x => x.HttpContext.User.IsInRole(UserLevel.Subrep.GetDescription())).Returns(true);
controllerContext.Setup(x => x.HttpContext.Request.Browser.Browser).Returns("InternetExplorer");
_controller.ControllerContext = controllerContext.Object;
_iMockManifestManager.Setup(x => x.ReturnSingleMainDataRecordViaTransNoCIDAndUserNameAsync(It.IsAny<string>, It.IsAny<string>, It.IsAny<string>)).ReturnsAsync(New MainData());
var transNo = "Asdf";
await _controller.Index(transNo, true, "sd", "dg");
Assert.AreEqual("www.facebook.com", _controller.HttpContext.Session["REDIRECT_TO"]);
}
是否有人知道如何更改我的代码,以便在我设置会话[“重定向到”]
时仍保持读/写状态
另外,我已经从VB.NET转换了它,但我精通两种语言,所以如果我犯了任何语法错误,都是因为我是徒手编写的。如果是这样的话,请告诉我
谢谢创建用于会话的存根,因为moq将难以设置用于保存索引属性中的值的集合。其他依赖项在moq中应按预期工作
class HttpSessionStateMock : HttpSessionStateBase {
private readonly IDictionary<string, object> objects = new Dictionary<string, object>();
public HttpSessionStateMock(IDictionary<string, object> objects = null) {
this.objects = objects ?? new Dictionary<string, object>();
}
public override object this[string name] {
get { return (objects.ContainsKey(name)) ? objects[name] : null; }
set { objects[name] = value; }
}
}
public async Task Index(string transNo, bool? isRechase, string clientID, string clientType)
{
switch (clientType.ToUpper())
{
case "RPI":
Session["REDIRECT_TO"] = "www.reddit.com";
break;
case "LM":
Session["REDIRECT_TO"] = "www.bbc.co.uk";
default:
Session["REDIRECT_TO"] = "www.stackoverflow.com";
break;
}
//Do async stuff
return null;
}
class HttpSessionStateMock : HttpSessionStateBase {
private readonly IDictionary<string, object> objects = new Dictionary<string, object>();
public HttpSessionStateMock(IDictionary<string, object> objects = null) {
this.objects = objects ?? new Dictionary<string, object>();
}
public override object this[string name] {
get { return (objects.ContainsKey(name)) ? objects[name] : null; }
set { objects[name] = value; }
}
}
[TestMethod]
public async Task Index_ClientTypeIsRPI_ExpectCorrectRedirect() {
//Arrange
var mock = new MockRepository(MockBehavior.Loose) {
DefaultValue = DefaultValue.Mock,
};
var session = new HttpSessionStateMock();//<-- session stub
var controllerContext = mock.Create<ControllerContext>();
controllerContext.Setup(_ => _.HttpContext.Session).Returns(session);
var _controller = new MyController() {
ControllerContext = controllerContext.Object
};
var transNo = "Asdf";
var clientID = "123";
var clientType = "RPI";
var sessionKey = "REDIRECT_TO";
var expected = "www.reddit.com";
//Act
await _controller.Index(transNo, true, clientID, clientType);
var actual = _controller.HttpContext.Session[sessionKey].ToString();
//Assert
Assert.AreEqual(expected, actual);
}