0
私は現在、以下のアプローチを使用してセッション変数を表す厳密に型指定されたオブジェクトを作成しています。Rhinoモック付きユニットテストのためのASP.NET MVCでのCustomer SessionHandlerオブジェクトの模擬
public abstract class SessionController : Controller
{
private const string SESSION_NAME = "UserSession";
public SessionData SessionData
{
get
{
SessionData sessionData = (SessionData)Session[SESSION_NAME];
if (sessionData != null)
{
return sessionData;
}
else
{
sessionData = new SessionData();
Session[SESSION_NAME] = sessionData;
return sessionData;
}
}
set
{
Session[SESSION_NAME] = value;
}
}
}
私はstrongley私れるSessionDataへのアクセスを入力したように、私はSessionControllerからそれを派生新しいコントローラを作成する場合SessionDataには、例えば
[Serializable]
public class SessionData
{
public String SessionId { get; set; }
public Int64 UserId { get; set; }
public String NameOfUser { get; set; }
}
のような単純なオブジェクトです。たとえば、
public CityController : SessionController
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
ViewData.Model = _cityService.GetAll(SessionData.UserId);
return View("Index");
}
}
ですから、私はこのアプローチをユニットテストでカバーするために苦労しています。私が試したものの短縮バージョンは、次のスニペット
[SetUp]
public void SetUp()
{
mocks = new MockRepository();
_cityService = MockRepository.GenerateStub<ICityService>();
_sesssionData = new SessionData { UserId = 1, SessionId = "1" };
// First Approach
controller = new CityController(_cityService);
controller.Expect(p => p.SessionData).Return(_sesssionData);
// Second Approach
cctx = MockRepository.GenerateStub<ControllerContext>();
cctx.Expect(p=>p.HttpContext.Session["UserSession"] as SessionData).Return(_sesssionData);
controller.ControllerContext = cctx;
}
でこの問題解決を取得する方法について誰先端を有し?
ヒントとコードスニペットをありがとう。それは魅力のように働いた。私はこれが最良のアプローチではなく、その働きであることを知っています。現在のコードベースのインフラストラクチャ全体を変更したくないので、私はそれを使用します。 – Gordon