Пересмешивание объекта Customer SessionHandler в ASP.NET MVC для юнит-тестов с помощью Rhino Mocks - PullRequest
0 голосов
/ 24 апреля 2009

В настоящее время я использую следующий подход для создания строго типизированного объекта, представляющего переменные сеанса.

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;
        }
    }  
}

SessionData - простой объект, подобный, например,

[Serializable]
public class SessionData
{
    public String SessionId { get; set; }
    public Int64 UserId { get; set; }
    public String NameOfUser { get; set; }
}

При создании нового контроллера я извлекаю его из SessionController, так что у меня есть типизированный доступ к моим SessionData. Например

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;
}

Кто-нибудь дал совет, как решить эту проблему?

1 Ответ

1 голос
/ 24 апреля 2009

Если вы сделаете ваше свойство SessionData виртуальным, тогда ваш первый подход может сработать:

// 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, этот подход не очень хорош, потому что SUT (субъект при тестировании => в данном случае CityController) подвергается насмешке с PartialMock.

...