ASP.NET MVC5 : Unit Testing a controller with a session

标签 asp.net asp.net-mvc

我读过很多关于模拟 session 对象或使用假对象的博客和评论,但我仍然无法将这些答案转换为我自己的代码。

这是我的 UserController 的索引操作,它使用依赖项注入(inject)将 IUserRepository 注入(inject)到构造函数中:

// GET: User
    public ActionResult Index()
    {
        User user = (User) Session["CurrentUser"];
        if (user != null) { 
            if(_repository.UserHasAdminAcces(user))
                return View(_repository.GetAllUsers().ToList());

            return RedirectToAction("DisplayErrorPage", "Error", new { errorMessage = "You have to be an Admin to enter this part" });
        }
        return RedirectToAction("Login");
    }

我的测试方法目前如下所示:

public void TestIndexForValidUser()
    {           
        var mock = new Mock<IUserRepository>();
        mock.Setup(x => x.UserHasAdminAcces(It.IsAny<User>())).Returns(true);

        UserController target = new UserController(mock.Object);

        // create mock HttpContext
        var context = new Mock<ControllerContext>();

        target.ControllerContext = context.Object;

        var result = target.Index() as ViewResult;

        Assert.AreEqual(result, "Index");

    }

我想给 ControllerContext 一个返回假用户的 session 对象,并确保返回一个名为 Index 的 View

最佳答案

我使用这种方法:

var controller = new HomeController();
var context = MockRepository.GenerateStub<ControllerContext>();
context.Expect(x => x.HttpContext.Session["MyKey"]).Return("MyValue");
controller.ControllerContext = context;

参见 ScottGu 的 blog post .

关于ASP.NET MVC5 : Unit Testing a controller with a session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29124257/

相关文章:

c# - 对 Json 响应感到沮丧

css - 在 asp :DataPager 中突出显示选定的页码

asp.net-mvc - 阻止用户在 ASP.NET MVC View 中输入脚本标记

c# - 为什么我不能在我的代码 asp.net c# 中使用来自 app_code 的代码文件

asp.net - Application Insight 中的 MVC 异常隐藏堆栈跟踪

javascript - 如何使用 jQuery ajax 请求触发事件处理程序背后的代码

asp.net-mvc - 如何绕过在 ASP.NET Web API 中发现多个操作的异常

html - MVC : Not render css class for certain view?

c# - 401 未经授权,即使在 FormsAuthentication.SetAuthCookie() 之后

jquery - 如何将 Jquery <div> 替换为可编辑的 &lt;textarea&gt;?