Ich verwende derzeit den folgenden Ansatz, um ein stark typisiertes Objekt zu erstellen, das Sitzungsvariablen darstellt.Verspotten eines Customer SessionHandler-Objekts in ASP.NET MVC für Fehlertests mit Rhino Mocks
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;
}
}
}
Session ist ein einfaches Objekt wie zum Beispiel
[Serializable]
public class SessionData
{
public String SessionId { get; set; }
public Int64 UserId { get; set; }
public String NameOfUser { get; set; }
}
Beim Erstellen eines neuen Controllers zu schaffen ich es von der Session derivatisieren so, dass ich strongley Zugriff auf meine Session getippt. Zum Beispiel
public CityController : SessionController
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
ViewData.Model = _cityService.GetAll(SessionData.UserId);
return View("Index");
}
}
Also, ich bin im Moment im Kampf, um dies durch einen Unitest abgedeckt zu erreichen. Eine verkürzte Version von dem, was ich versucht habe, ist das
Snippet folgende[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;
}
Hat jemand einen Tipp, wie dieses Problem gelöst werden?
Danke für den Hinweis und das Code-Snippet. Das hat wie ein Zauber funktioniert. Ich weiß, dass dies nicht der beste Ansatz ist, aber es funktioniert. Ich möchte nicht die gesamte Infrastruktur meiner derzeitigen Codebasis ändern, also werde ich sie verwenden. – Gordon