Действия тестирования MVC, основанные на HTTPContext - PullRequest
1 голос
/ 26 сентября 2011

У меня есть проект, в котором мне нужно предоставить тесты действий. Моя задача заключалась в том, чтобы гарантировать, что действия не полагаются на то, что они не получают в качестве параметров, с использованием ValueProviders и ModelBinder. Как таковой, я бы перешел в HTTPContextBase и т. Д.

Однако теперь у меня есть действие, которое использует статический класс, который является оберткой вокруг HTTPContext для доступа к сеансу и идентификации. Таким образом, кажется, я должен макет HTTPContext, чтобы проверить это действие. Думаю, не слишком сложно, но кажется, что это неправильно.

Мне кажется, что статический класс необходимо переработать, чтобы создать экземпляры с HTTPSessionStateBase и IPrinicple и использовать их в качестве внутренних хранилищ. Тогда я мог бы создать экземпляр этой оболочки в своем действии из параметров действия, сделав действие и класс оболочки более удобным для тестирования.

Было бы это рекомендуемым приложением или у кого-то есть другие идеи, если бы мне не пришлось менять свой статический класс на экземпляр?

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Я думаю, что использование Moq для насмешки над HttpContext - это то, что вы можете попробовать.

[TestMethod]
public void Test()
{

    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    context.Setup(c => c.Request).Returns(request.Object);

    HomeController controller = new HomeController();

    controller.ControllerContext = new ControllerContext( context , new RouteData(), controller );

    ....
    ...........
}




Обновлено:
В случае, если вы хотите издеваться над HttpSession (как упомянуто в комментарии gdoron).На самом деле это не сложно, так как вы МОНКИРУЕТЕ что-то, но это не значит, что вам нужно построить целый, реальный объект и все его свойства.

Предположим, что ваш контроллер будет

  1. Проверяет,пользователь аутентифицирован.
  2. Получает имя личности.
  3. Получает значение из сеанса ["ключ"].
  4. манипулирует cookie.

код может быть таким:

[TestMethod]
public void Test()
{
    ......
    .........
    var mockedControllerContext = new Mock<ControllerContext> ();
    mockedControllerContext.SetupGet(p => p.HttpContext.Session["key"]).Returns("A value in session");
    mockedControllerContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);    
    mockedControllerContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("An identity name");
    mockedControllerContext.SetupGet(p => p.HttpContext.Response.Cookies).Returns(new HttpCookieCollection ());

    HomeController controller = new HomeController();
    controller.ControllerContext = mockedControllerContext.Object;
    .....
    ......

}
0 голосов
/ 26 сентября 2011

Я настоятельно рекомендую использовать MvcContrib - testhelpers Узнайте, как использовать от CodePlex
Вы можете скачать его с nuget или напрямую с CodePlex
Удачи!

...