在asp.net mvc中“伪装”控制器的Session变量(HttpSessionstateBase)

时间:2015-08-04 08:32:44

标签: c# asp.net asp.net-mvc microsoft-fakes

我目前正致力于使用Microsoft Fakes进行单元测试并测试使用某些会话变量的控制器。          由于在单元测试创​​建期间没有启动任何会话,每当我运行单元测试时,我都遇到了NullReferenceException。我已经看到很多问题和答案使用Moqs,但我希望它在Microsoft Fakes中。         我知道我需要使用填充程序来伪造会话变量,因为我对于如何创建会话确实没有一个清晰的想法我被困在那里。         请解释我如何创建一个会话以便我可以伪造它,如果可能的话请告诉我如何用微软假货写它

1 个答案:

答案 0 :(得分:2)

嗯,你可以这样做:

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/。 祝你有愉快的一天。