ASP.NET MVCでセッションの内容を確かめたい


セッションは本来Controller.HttpContextに属するため、中身を見ることはできない。
しかし、確認したい場合は出てくる。ビューでセッション変数を読み込む場合だ。
そこで、以下の様なコードをテストに入れる(MSTestを利用しているが、他のフレームワークに即した形で修正すれば大丈夫なはずだ)。

[TestMethod]
public void Test()
{
    var controllerContext = new Mock<ControllerContext>();
    var session = new Mock<HttpSessionStateBase>();
    var sessionValue = string.Empty; // セッションの値を受け取る変数
    session.SetupSet(s => s["value"] = It.IsAny<object>())
        .Callback((string name, object o) => { sessionValue = (string)o; });
    controllerContext.Setup(p => p.HttpContext.Session).Returns(session.Object);

    var controller = new FooController { ControllerContext = controllerContext.Object };
    var result = contoller.Index() as ViewResult; // FooController.Index()内でSession["value"]の値が"bar"に変わると想定

    Assert.AreEqual(string.Empty, result.ViewName);
    Assert.AreEqual("bar", sessionValue);
}

参考:Tales from the Evil Empire - Mocking indexer setters with Moq