セッションを使用するコントローラをテストするための単体テストを作成しようとしています。私は、httpcontextがブラウザからのリクエストからのみ生成され、コントローラーアクションフォームのユニットテストを呼び出してから現在のコンテキストがnullになるという概念を理解しています。ユニットテストセッションは、Mocking後もnullを返す
私はこの記事の最初の部分に基づいてこの問題を解決しようとしましたが、http://www.dontpaniclabs.com/blog/post/2011/03/22/testing-session-in-mvc-in-four-lines-of-code/まだそれは私のために働いていません。以下の私のコードを見てください。
[TestFixtureSetUp]
public void Configure_AutoMapper()
{
_product = new ProductViewModel()
{
Id = Guid.NewGuid(),
Category = Guid.Parse("72E42A11-DFA4-4AB9-A735-5CD5C18396D4"),
Brand = Guid.Parse("96E68B67-60FB-4531-898E-815433B44D89"),
Description = "From test",
CostPrice = Parse("17.00"),
SalePrice = Parse("25.00"),
Quantity = 7,
BusinessId = Guid.Parse("BDF9FB7F-DB40-4365-9872-AECD616ED415")
};
var context = new Mock<ControllerContext>();
var session = new Mock<HttpSessionStateBase>();
context.Setup(m => m.HttpContext.Session).Returns(session.Object);
_productsController = new ProductsController {ControllerContext = context.Object};
var userSessionInfo = new UserSessionViewModel()
{
FirstName = "Junior",
LastName = "Labolz",
BusinessId = Guid.Parse("BDF9FB7F-DB40-4365-9872-AECD616ED415")
};
SessionHelper.AddUserDetailsToSession(SessionHelper.UserDetails, userSessionInfo);
}
[Test]
public void Display_Products_List_On_View_Products_Button_Click()
{
//Set Up
//Act
var viewResult = (ViewResult)_productsController.Index();
//Assert
Assert.That(string.Empty, Is.EqualTo(viewResult.ViewName));
}
public static void AddUserDetailsToSession(string sessionName, UserSessionViewModel userSessionDetails)
{
HttpContext.Current.Session.Add(sessionName, userSessionDetails);
}
**リチャードの答えに基づいて、私はそれを変更**
var context = new Mock<ControllerContext>();
var session = new Mock<HttpSessionStateBase>();
context.Setup(m => m.HttpContext.Session).Returns(session.Object);
var userSessionInfo = new UserSessionViewModel()
{
FirstName = "Junior",
LastName = "Labolz",
BusinessId = Guid.Parse("BDF9FB7F-DB40-4365-9872-AECD616ED415")
};
context.Object.HttpContext.AddUserDetailsToSession(SessionHelper.UserDetails, userSessionInfo);
_productsController = new ProductsController {ControllerContext = context.Object};
製品のコントローラのコンストラクタ
public ProductsController()
{
_productService = new ProductServiceClient();
_userSessionViewModel = (UserSessionViewModel)SessionHelper.GetSessionDetail(SessionHelper.UserDetails);
}
セッション方式
public static object GetSessionDetail(string sessionName)
{
return HttpContext.Current.Session[sessionName];
}
を取得します。
私はまだ私もだかもしれないので、null参照の例外を取得しています私のproductControllerコンストラクタでセッションを読み込もうとしていますか? –
私のコードを更新しました。私を探してください。私は拡張メソッドを使用するように変更しました。リチャードの答えに基づいて、私のアップデートにタイトルがあります。また、私の製品コントローラにあるものを表示しています –
どこでもHttpContext.Currentを使用することはできません.ContentContextからHttpContextを取得できます。これはコントローラのコンストラクタからSessionにアクセスするべきではありません。なぜなら、これが呼び出された時点でコンテキストがないからです。 – Richard