2009-04-24 5 views
0

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?

Antwort

0

Wenn Sie Ihre Session Eigenschaft virtuellen machen dann Ihre erste Ansatz funktionieren könnte:

// Arrange 
var mocks = new MockRepository(); 
var cityService = MockRepository.GenerateStub<ICityService>(); 
var sesssionData = new SessionData { UserId = 1, SessionId = "1" }; 
var controller = mocks.PartialMock<CityController>(cityService); 
controller.Expect(c => c.SessionData).Return(sessionData); 
controller.Replay(); 

// Act 
controller.Index(); 

//Assert 
... 

IMO dieser Ansatz ist nicht sehr gut, weil der SUT (Subject Under Test => in diesem Fall CityController) wird verspottet mit PartialMock.

+0

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