Простой вопрос: Настройка макета для ajax-запроса в asp.net mvc - PullRequest
2 голосов
/ 04 апреля 2011

Я новичок в модульном тестировании и разработке MVC.
У меня вопрос по использованию moq для модульного тестирования в asp.net mvc.У меня есть контроллер, который принимает действие AJAX:

 [HttpPost,Authorize]
        public ActionResult GrabLink()
        {
            string username = HttpContext.User.Identity.Name;
            string rssUrl = Request.Params["Grablink"].ToString();
...}

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

     var mockRequest = new Moq.Mock<HttpRequestBase>();

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

Я новичок в обработке веб-запроса.Если у вас есть хороший учебник для лучшего понимания запроса Http (а также Httpcontext и связанных классов в asp.net), пожалуйста, напишите здесь.Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 04 апреля 2011

Это очень хорошо работает для меня:

var controller = new HomeController();

var context = new Mock<HttpContextBase>(MockBehavior.Strict);
var controllerContext = new Mock<ControllerContext>();

controllerContext.SetupGet(x => x.HttpContext.User.Identity.Name)
    .Returns("TestUser");
controllerContext.SetupGet(x => x.HttpContext.User.Identity.IsAuthenticated)
    .Returns(true);
controllerContext.SetupGet(x => x.HttpContext.Request.IsAuthenticated)
    .Returns(true);
controller.ControllerContext = controllerContext.Object;

// As a bonus, instantiate the Url helper to allow creating links
controller.Url = new UrlHelper(
    new RequestContext(context.Object, new RouteData()), new RouteCollection());

Это позволит вам инициализировать любого пользователя, которого вы хотите использовать в качестве аутентифицированного пользователя, а последняя строка позволит вам использовать помощника Url в пределахконтроллер, даже если вы вызываете его из модульного теста.

1 голос
/ 04 апреля 2011

Хорошо, @cem очень хорошо рассмотрел ваш второй вопрос.

Для вашего первого nerddinner , и, если я не ошибаюсь, при создании нового интернет-приложения с модульным тестом в Visual Studio, используйте следующие классы-макеты для HttpContext,Он находится внизу этого файла .

Вы можете использовать их (или создать новое интернет-приложение + тесты с VS) и скопировать все поддельные классы для ваших тестов.(Я написал пример Moq ниже)

Это выглядит так:

public class MockHttpContext : HttpContextBase {
    private IPrincipal _user;

    public override IPrincipal User {
        get {
            if (_user == null) {
                _user = new MockPrincipal();
            }
            return _user;
        }
        set {
            _user = value;
        }
    }

    public override HttpResponseBase Response
    {
        get
        {
            return new MockHttpResponse();
        }
    }
}

public class MockHttpResponse : HttpResponseBase {
    public override HttpCookieCollection Cookies
    {
        get
        {
            return new HttpCookieCollection();
        }
    }
}

Не проверено, но для использования mock это будет выглядеть так:

var fakeReqBase = new Mock<HttpRequestBase>();
fakeReqBase.Setup(f => f.User).Returns(new GenericIdentity("FakeUser"));
//generic identity implements IIdentity
fakeUserRepo.Object;//this returns fake object of type HttpRequestBase

Оформить заказ Moq Quickstart .Его довольно легко привыкнуть, и свободный интерфейс действительно помогает.

1 голос
/ 04 апреля 2011

Как сказал Скотт , HttpContext затрудняет тестирование контроллеров. В любом случае, у него есть симпатичное решение на здесь .

Кстати, почему вы не сделали rssUrl параметром, если он присваивается POST или GET?

например.

//POST: /GrabLink?rssUrl=bla bla...

[HttpPost,Authorize]
public ActionResult GrabLink(IPrincipal user, string rssUrl) {
    string userName = user.Name;
}
...