Создание фиктивного URL-реферера в ASP.Net MVC для модульного тестирования - PullRequest
6 голосов
/ 10 февраля 2010

В настоящее время я тестирую свое приложение и пытаюсь понять, как создать собственный поддельный URL-реферер. Я пытался жестко закодировать его, но получаю сообщение об ошибке, что оно доступно только для чтения. Вот что я пробовал до сих пор:

fakeController.HttpContext.Request.UrlReferrer.AbsolutePath = "http://www.yahoo.com";

а также

fakeController.Request.UrlReferrer = "http://www.yahoo.com";

Я искал в Интернете некоторые идеи о том, как создать поддельный / фиктивный URL-реферер для моего поддельного контроллера, но безуспешно. Любые предложения приветствуются.

Примечание. Я использую встроенные средства модульного тестирования Visual Studios.

UPDATE:

Спасибо всем за ваши предложения, я был бы более чем готов использовать любую другую систему модульного тестирования, кроме Visual Studio, к сожалению, здесь, на моей работе, нам разрешено использовать только встроенную систему Visual Studio, поэтому я должен работать с тем, что у меня есть. Спасибо, хотя, приятно знать, что эти варианты есть.

Ответы [ 4 ]

8 голосов
/ 10 февраля 2010

Создайте фиктивный запрос для HttpContext, затем установите ожидание для запроса, который возвращает Uri. Пример использования RhinoMocks.

 var context = MockRepository.GenerateMock<HttpContextBase>();
 var request = MockRepository.GenerateMock<HttpRequestBase>();
 request.Expect( r => r.UrlReferrer ).Returns( new Uri( "http://www.yahoo.com" ) ).Repeat.AtLeastOnce();
 context.Expect( c => c.Request ).Returns( request ).Repeat.Any();

 fakeController.HttpContext = context;
3 голосов
/ 29 августа 2013

Ответ tvanfosson в правильном направлении, но немного устарел. (Предоставленный OP не может использовать MOQ, добавлен для дальнейшего использования)

    // Dependency Mocks initialization ....
    ....
    MyController controller = new MyController(mock.Object, ...dependencies...);

    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    request.Setup(r => r.UrlReferrer).Returns(new Uri("http://www.site.com"));
    context.Setup(c => c.Request).Returns(request.Object);

    // Setting the HttpContext
    // HttpContext is read-only, but it is actually derived from the
    // ControllerContext, which you can set. 
    controller.ControllerContext = new ControllerContext(context.Object, 
        new RouteData(), controller);
    //target.HttpContext = context.Object; // outdated

HttpContext из контекста контроллера

1 голос
/ 10 февраля 2010

Вам понадобится создать весь фиктивный HttpContext, чтобы выполнить это, к сожалению. Вместо того, чтобы жестко программировать это, я настоятельно рекомендую использовать макеты, поскольку это позволит вам избежать установки частей объекта, которые вам на самом деле не нужны.

Я бы предложил почитать пост Скотта Хансельмана MvcMockHelpers , чтобы получить представление о том, что с ним связано (он включает код как для Rhino, так и для Moq).

1 голос
/ 10 февраля 2010

Рекомендую перейти на Mock Framework, такой как NMock или Rhino Mock, который позволяет создавать их и возвращает определенное значение для данного вызова, например метод get, в этом свойстве.

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