如何在Moq框架中模拟HttpContext(ControllerContext),并进行会话

时间:2014-03-05 14:32:51

标签: c# asp.net-mvc mocking moq httpcontext

我想测试我的MVC应用程序,我想模拟HttpContext。我正在使用 Moq 框架,以下是我为模拟HttpContext所做的工作:

[SetUp]
public void Setup()
{
    MyUser myUser = new MyUser();
    myUser.Id = 1;
    myUser.Name = "AutomatedUITestUser";

    var fakeHttpSessionState = 
                         new FakeHttpSessionState(new SessionStateItemCollection());
    fakeHttpSessionState.Add("__CurrentUser__", myUser);

    ControllerContext mockControllerContext = Mock.Of<ControllerContext>(ctx =>
        ctx.HttpContext.User.Identity.Name == myUser.Name &&
        ctx.HttpContext.User.Identity.IsAuthenticated == true &&
        ctx.HttpContext.Session == fakeHttpSessionState &&
        ctx.HttpContext.Request.AcceptTypes == 
                       new string[]{ "MyFormsAuthentication" } &&
        ctx.HttpContext.Request.IsAuthenticated == true &&
        ctx.HttpContext.Request.Url == new Uri("http://moqthis.com") &&
        ctx.HttpContext.Response.ContentType == "application/xml");

    _controller = new SomeController();
     _controller.ControllerContext = mockControllerContext; //this line is not working
    //when I see _controller.ControllerContext in watch, it get's me 
    //_controller.ControllerContext threw an exception of type System.ArgumentException
}

[Test]
public void Test_ControllerCanDoSomething()
{
    // testing an action of the controller
    // The problem is, here, System.Web.HttpContext.Current is null
}

因为我的应用程序使用会话来保存几乎所有操作方法中的用户数据和身份验证信息,因此我需要设置HttpContext并在其中我需要设置Session并将__CurrentUser__放入会话中,以便操作方法可以访问伪造的登录用户。

但是,HttpContext未设置且为空。我搜索了很多,我找不到答案。 可能有什么问题?

更新 我也测试下面的行,并获得相同的结果

_controller.ControllerContext = new ControllerContext(
                       mockControllerContext.HttpContext, new RouteData(), _controller);

1 个答案:

答案 0 :(得分:4)

根据这个答案判断:Mocking Asp.net-mvc Controller Context

看起来您需要模拟Request本身以及请求对象的属性。

e.g。

var request = new Mock<HttpRequestBase>();

等(完整代码在链接的答案中)。