Переменные сеанса контроллера модуля в MVC3 - PullRequest
4 голосов
/ 08 августа 2011

Я выполняю модульное тестирование моего контроллера.

В одном из методов моего контроллера я устанавливаю переменные сеанса:

 public void Index(){
      Session["foo"] = "bar";

      return View();
 }

Как мне выполнить это модульное тестирование?Проблема в том, что при тестировании свойство Session имеет значение null.Внедрение невозможно, поскольку свойство Session доступно только для чтения.

 [TestMethod]
 public void TestIndex()
     // When
     _controller.Index();

     // Then
     Assert.AreEqual("bar", _controller.Session["foo"])

Ответы [ 3 ]

7 голосов
/ 08 августа 2011

Лично мне нравится использовать MvcContrib TestHelper , который проверяет весь HTTP-конвейер:

[TestMethod]
public void HomeController_Index_Action_Should_Store_Bar_In_Session()
{
    // arrange
    var sut = new HomeController();
    new TestControllerBuilder().InitializeController(sut);

    // act
    sut.Index();

    // assert
    Assert.AreEqual("bar", (string)sut.Session["foo"]);
}
3 голосов
/ 17 февраля 2012

Это то, что я использовал для дружественного модульного тестирования Session Caching. Проверяя HttpContext.Current на null, вы проходите кеширование для nunit-тестов и все еще позволяете вашей программе нормально работать.

Это самое простое решение без большого количества изменений кода в вашем проекте.

internal class SessionCache
{
    public static void Store(string key, object val) {
        if (HttpContext.Current != null) {
            HttpContext.Current.Session[key] = val;
        }
    }

    public static object Retrieve(string key) {
        if (HttpContext.Current != null) {
            return HttpContext.Current.Session[key];
        }

        return null;
    }
}
2 голосов
/ 08 августа 2011

Я всегда рекомендую оборачивать объект сеанса в другой объект.Это не только упрощает тестирование, но и обеспечивает безопасный доступ ко всем типам сеансов.Очень легко напечатать имя сеансового ключа в одном месте в одном месте, а затем часами искать ошибку.

Объект будет иметь поля как

public Foo{
    get{return Session["Foo"];}
    set{Session["Foo"]=value;}  
}

. После тестирования вы можете смоделировать класс сеанса с помощью фиктивного элемента, который сохраняет состояние только для теста.

Обычно я обращаюсь с этим путем внедрения зависимости.Как это настроить - долгий экзамен.Вот ссылка на один из способов http://weblogs.asp.net/shijuvarghese/archive/2011/01/21/dependency-injection-in-asp-net-mvc-3-using-dependencyresolver-and-controlleractivator.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...