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

"Faking" Session variable(HttpSessionstateBase) of the controller in asp.net mvc

我目前正在使用 Microsoft Fakes 进行单元测试,并测试使用一些会话变量的控制器。 由于每当我进行 运行 单元测试时,在单元测试创​​建过程中都不会启动任何会话,因此我遇到了 NullReferenceException.I 已经看到很多使用 Moqs 进行的问题和答案,但我希望它在 Microsoft Fakes 中。 我知道我需要使用垫片来伪造会话变量,因为我不清楚会话是如何创建的,所以我被困在那里。 请向我解释会话是如何创建的,以便我可以伪造它,如果可能的话,请告诉我如何在 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/了解更多详情。 祝你有个愉快的一天。