我認爲使用Moq來模擬一個HttpContext只是你可能想要嘗試的方式。
[TestMethod]
public void Test()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
context.Setup(c => c.Request).Returns(request.Object);
HomeController controller = new HomeController();
controller.ControllerContext = new ControllerContext(context , new RouteData(), controller);
....
...........
}
更新時間:
如果您想嘲笑HttpSession中(如在評論中提及gdoron)的情況。它並不是很複雜,因爲你是Mocking,並不意味着你必須構建完整的,真實的對象及其所有屬性。
假設您的控制器將
- 檢查是否用戶進行身份驗證。
- 獲取標識名稱。
- 從Session [「key」]中獲取一個值。
- 操縱cookie。
的代碼可能是這樣的:
[TestMethod]
public void Test()
{
......
.........
var mockedControllerContext = new Mock<ControllerContext>();
mockedControllerContext.SetupGet(p => p.HttpContext.Session["key"]).Returns("A value in session");
mockedControllerContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
mockedControllerContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("An identity name");
mockedControllerContext.SetupGet(p => p.HttpContext.Response.Cookies).Returns(new HttpCookieCollection());
HomeController controller = new HomeController();
controller.ControllerContext = mockedControllerContext.Object;
.....
......
}
有一個快速瀏覽一下他們,特別是我的情況,看來你是能夠建立一個控制範圍內,但不會出現是初始化ASP的HTTPContext.Current的任何東西。因此,當我的動作調用靜態包裝類時,它依次嘗試訪問HTTPContext.Current.Session,我得到一個錯誤。我想我只需要經歷在我的測試中初始化HTTPContext.Current的痛苦? – ricardo
@ricardo它看起來像你不使用DI。注入httpContext並且所有的問題都會消失......使用靜態httpContext.Current是一個錯誤,你可以在你的情況下看到它。祝你好運! – gdoron