ASP.NET MVC5:使用会话对控制器进行单元测试

Aet*_*rna 4 asp.net asp.net-mvc

我已经阅读了许多关于模拟会话对象或使用假对象的博客和评论,但我仍然无法将这些答案翻译成我自己的代码。

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

// 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");
    }
Run Code Online (Sandbox Code Playgroud)

我的测试方法目前看起来像这样:

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

    }
Run Code Online (Sandbox Code Playgroud)

我想给 ControllerContext 一个返回假用户的会话对象,并确保返回一个名为 Index 的视图

And*_*rei 6

我使用这种方法:

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

请参阅 ScottGu 的博客文章