Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试:使用Moq设置读/写会话变量_C#_Asp.net Mvc_Unit Testing_Session_Moq - Fatal编程技术网

C# 单元测试:使用Moq设置读/写会话变量

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() {

我有一个函数,它基于一些内部逻辑,将重定向字符串存储在会话变量(redirect_To)中。我正在尝试编写一个单元测试,一旦调用的操作完成,它将检查这个会话变量的值

我使用Moq来模拟我的一些属性和函数。但是,每当我使用Moq设置会话变量(Redirect_To)时,它必须将其设置为只读,因为我不能再为它赋值,这会导致单元测试失败

下面是我的单元测试:

 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);

}