Как издеваться над HttpContext (ControllerContext) в структуре Moq и иметь сеанс

Я хочу протестировать свое приложение MVC и издеваться над HttpContext. Я использую структуру Moq, и вот что я сделал для имитации HttpContext:

[SetUp]
public void Setup()
{
    MyUser myUser = new MyUser();
    myUser.Id = 1;
    myUser.Name = "AutomatedUITestUser";

    var fakeHttpSessionState = 
                         new FakeHttpSessionState(new SessionStateItemCollection());
    fakeHttpSessionState.Add("__CurrentUser__", myUser);

    ControllerContext mockControllerContext = Mock.Of<ControllerContext>(ctx =>
        ctx.HttpContext.User.Identity.Name == myUser.Name &&
        ctx.HttpContext.User.Identity.IsAuthenticated == true &&
        ctx.HttpContext.Session == fakeHttpSessionState &&
        ctx.HttpContext.Request.AcceptTypes == 
                       new string[]{ "MyFormsAuthentication" } &&
        ctx.HttpContext.Request.IsAuthenticated == true &&
        ctx.HttpContext.Request.Url == new Uri("http://moqthis.com") &&
        ctx.HttpContext.Response.ContentType == "application/xml");

    _controller = new SomeController();
     _controller.ControllerContext = mockControllerContext; //this line is not working
    //when I see _controller.ControllerContext in watch, it get's me 
    //_controller.ControllerContext threw an exception of type System.ArgumentException
}

[Test]
public void Test_ControllerCanDoSomething()
{
    // testing an action of the controller
    // The problem is, here, System.Web.HttpContext.Current is null
}

Поскольку мое приложение использует Сеанс для хранения пользовательских данных и информации аутентификации почти в каждом методе действия, мне нужно установить HttpContext, а внутри него мне нужно установить Session и поместить __CurrentUser__ внутри сеанса, чтобы методы действий иметь доступ к фальшивому авторизованному пользователю.

Однако HttpContext не установлен и имеет значение null. Я много искал и не нашел ответа. Что может быть не так?

Обновление: я также тестирую строку ниже и получаю тот же результат

_controller.ControllerContext = new ControllerContext(
                       mockControllerContext.HttpContext, new RouteData(), _controller);

person Omid Shariati    schedule 05.03.2014    source источник
comment
возможный дубликат Как издеваться над HttpContext в ASP.NET MVC с использованием Moq?   -  person Mike Cheel    schedule 05.03.2014
comment
Microsoft рекомендует использовать HttpContextWrapper в коде, чтобы впоследствии было проще модульное тестирование. msdn.microsoft.com/en-us/library/   -  person Mike Cheel    schedule 05.03.2014
comment
спасибо @MikeCheel, но у меня другой вопрос, я не устанавливаю HttpContext вместо ControllerContext, моя проблема в том, что я не могу установить ControllerContext! кто-нибудь может ответить на мой вопрос?   -  person Omid Shariati    schedule 05.03.2014
comment
Вы можете создать ControllerContext и передать HttpContextBase в его конструктор. Кроме того, HttpContext в ControllerContext является HttpContextBAse, поэтому вы должны иметь возможность использовать HttpContextWrapper.   -  person Mike Cheel    schedule 05.03.2014
comment
Я также тестирую строку ниже и получаю тот же результат _controller.ControllerContext = new ControllerContext (mockControllerContext.HttpContext, new RouteData (), _controller);   -  person Omid Shariati    schedule 05.03.2014
comment
Пробовали ли вы включить пошаговое выполнение исходного кода .net в Visual Studio, чтобы увидеть, где выбрасывается исключение, это может дать вам еще несколько подсказок?   -  person Alex KeySmith    schedule 06.03.2014


Ответы (1)


Судя по этому ответу: Mocking Asp.net-mvc Controller Context

Похоже, вам нужно смоделировать сам запрос, а также свойства объекта запроса.

e.g.

var request = new Mock<HttpRequestBase>();

и т. д. (полный код находится в связанном ответе).

person Alex KeySmith    schedule 06.03.2014
comment
Как насчет издевательства над System.Web.HttpRequest (Form) в WebApi? - person Dave; 24.07.2015
comment
Привет, @Dave, тебе лучше задать отдельный вопрос, если ты еще этого не сделал. - person Alex KeySmith; 10.11.2015