"Faking" asp.net mvc 中控制器的会话变量(HttpSessionstateBase)



我目前正在使用Microsoft Fakes进行单元测试,并测试使用一些会话变量的控制器。由于在单元测试创建期间,无论何时运行单元测试,都没有启动会话,因此我遇到了NullReferenceException。我见过很多用Moqs做的问题和答案,但我想用微软的Fakes。我知道我需要使用shims来伪造会话变量,因为我不清楚会话是如何创建的。请告诉我一个会话是如何创建的,这样我就可以伪造它,如果可能的话,请让我知道如何在microsoft fakes

中编写它

你可以这样做:

public class SomeClass
{
    public bool SomeMethod()
    {
        var session = HttpContext.Current.Session;
        if (session["someSessionData"].ToString() == "OK")
            return true;
        return false;               
    }
}
[TestMethod]
public void SomeTestMethod()
{
    using (ShimsContext.Create())
    {
        var instanceToTest = new SomeClass();
        var session = new System.Web.SessionState.Fakes.ShimHttpSessionState();
        session.ItemGetString = (key) => { if (key == "someSessionData") return "OK"; return null; };
        var context = new System.Web.Fakes.ShimHttpContext();
        System.Web.Fakes.ShimHttpContext.CurrentGet = () => { return context; };
        System.Web.Fakes.ShimHttpContext.AllInstances.SessionGet =
            (o) =>
            {
                return session;
            };
        var result = instanceToTest.SomeMethod();
        Assert.IsTrue(result);
    }
}

详情请参阅http://blog.christopheargento.net/2013/02/02/testing-untestable-code-thanks-to-ms-fakes/。祝你过得愉快。

最新更新